C语言总结-----基本数据类型与表达式

目录

 

一.基本数据类型

(一)常量

(二)变量     

二.运算符与表达式

(一)6类基本运算符和表达式

(二)自增自减运算符

三.数据输入输出

(一)数据输出

(二)数据输入


一.基本数据类型


 

#include <stdio.h>

int main()
{
    printf("sizeof(short) = %d\n",sizeof(short)); //2
    printf("sizeof(int) = %d\n",sizeof(int)); //4
    printf("sizeof(long) = %d\n",sizeof(long)); //4
    printf("sizeof(float) = %d\n",sizeof(float)); //4
    printf("sizeof(double) = %d\n",sizeof(double)); //8

    char c = 255;
    printf("%d\n",c); //-1

    int a = -20;
    unsigned int b = 10;
    printf("%d\n",a+b);//-10

    printf("sizeof(1.0) = %d\n",sizeof(1.0)); //8
    printf("sizeof(1.0l) = %d\n",sizeof(1.0l)); //12

    printf("'a' = %d,'0' = %d\n",'a','0'); //97,48
    
    char ch1 = '\101'; //A
    char ch2 = '\x41'; //A
    printf("ch1 = %c,ch2 = %c\n",ch1,ch2);
    printf("'\101','\x41'\n"); //A A

    printf("Please enter \"Y\" or \"N\": \n"); //Please enter "Y" or "N":
    return 0;
}

(一)常量

1.char c = 255; printf("%d\n",c);

知识点:(1)数以码形式存在 数以码形式存在

               (2)原码到补码的转换 和 补码到原码的转换 都是取反+1(二进制)

             (3)最高位用来判断数的正负,不参与运算 。0为正数 1为负数

255的二进制表示为:1111 1111     (最高为1,则是负数,负数以补码的形式存在,则化为原码 取反+1)

取反高位不参与运算 :1000 0000

+1                             :1000 0001

得到结果                   :printf("%d\n",c)为 -1

2.常用ASCII码:

‘0’      48                       ‘A’      65                     ‘a'    97

也可用八、十六进制表示如:’0‘    十进制:48     八进制:’\60‘       十六进制:’\x30‘

3.实数型:由整数和小数形成,可忽略其一

十进制:    35.(35.0)     .689 (0.689)       都是double型

指数形式:在小鼠后面加E/e表示指数,指数部分必须是整数

                 1e-2  (1*10^-2)       0.5E10  (0.5*10^10)      都是double型

1e-2f (float型)    3.2L (long double型)   

4.常用转义字符:\n  换行       \r   回车

windows中的Enter等于\n\r(既回车又换行)

5.    printf("Please enter \"Y\" or \"N\": \n");          //Please enter "Y" or "N":  

(二)变量     

1.变量名/用户标识符的命名规范:

(1)以字母或下划线开头,由数字,字母,下划线组成。

(2)区分大小写的。如:A1与a1是不同的标识符。

  (3)不能采用关键字int,float等。

2.变量如果不初始化,内存单元可能保留着先前的内容

3.单精度实型提供7位有效数字,双精度实型提供15~16位有效数字。
       
如:float  a;
               a=111111.111    (最后两位小数不起作用)一共9个有效数字
       而:double  a;
               a=111111.111    (全部接收)

#include <stdio.h>

int main()
{
    float a,b;
    a = 123456.789e5;
    b = a + 20;
    printf("a = %f,b = %f\n",a,b);

    return 0;
}


//结果为a = 12345678848.000000,b = 12345678848.000000
//实际应为12345678920

1234567是float能接受的 余下的都无意义

4.字符串

字符串都是以\0结尾的,所以空字符串实际上有一个字符:\0

二.运算符与表达式

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

--

()

圆括号

(表达式)/函数名(形参表)

--

.

成员选择(对象)

对象.成员名

--

->

成员选择(指针)

对象指针->成员名

--

2

-

负号运算符

-表达式

右到左

单目运算符

~

按位取反运算符

~表达式

++

自增运算符

++变量名/变量名++

--

自减运算符

--变量名/变量名--

*

取值运算符

*指针变量

&

取地址运算符

&变量名

!

逻辑非运算符

!表达式

(类型)

强制类型转换

(数据类型)表达式

--

sizeof

长度运算符

sizeof(表达式)

--

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

%

余数(取模)

整型表达式%整型表达式

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

5

<< 

左移

变量<<表达式

左到右

双目运算符

>> 

右移

变量>>表达式

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

小于

表达式<表达式

<=

小于等于

表达式<=表达式

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1?

表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

--

/=

除后赋值

变量/=表达式

--

*=

乘后赋值

变量*=表达式

--

%=

取模后赋值

变量%=表达式

--

+=

加后赋值

变量+=表达式

--

-=

减后赋值

变量-=表达式

--

<<=

左移后赋值

变量<<=表达式

--

>>=

右移后赋值

变量>>=表达式

--

&=

按位与后赋值

变量&=表达式

--

^=

按位异或后赋值

变量^=表达式

--

|=

按位同或后赋值

变量|=表达式

--

15

逗号运算符

表达式,表达式,…

左到右

--

说明:

    同一优先级的运算符,运算次序由结合方向所决定。
    简单记就是:自增自减 > ! >  算术运算符  >  关系运算符  >  &&  >  ||  > 条件运算符 >  赋值运算符 > 逗号运算符

(一)6类基本运算符和表达式

1.算术运算符和算术表达式

          * 、/、%  优先级相同高

         +、-          优先级相同低    

数据参加运算前要进行下列转换:
char,short→int→float→double
混合运算时数据类型由低级→高级
unsigned → int → long → double
以上并不意味着unsigned必须到int再到long的依次转换,而是由算式中的最高级进行转换的。

例如:   若有 int i, float f, double  d, long e
             则 10+'a'+i*f-d/e 表达式运算次序为:
①将'a' --> 97,然后10+'a'运算。(char --> int)
② 将 i--> float型,然后i*f运算。 (int --> float)
③ 将 ①的结果 -- > float型,然后与 ②的结果相加。(int --> float)
④ 将e-->double型,然后d/e运算。(long --> double)
⑤ 将 ③的结果转换为double型,然后与减 ④的结果。(float --> double)
 
结论:当两个数据运算时类型不同,则将运算类型低的转化为运算类型高的后再运算,运算结果为类型高的数据。
 
 

2.赋值运算符和赋值表达式

(1)赋值符号:=   将赋值符右边表达式的值赋给赋值符左边的一个变量。
 
(2)赋值运算符的数据类型若不一致,则要进行类型转换。转换方式为:

  • 将实型数据-->整型变量,舍弃实数的小数部分。

  如:int i;   i=5.65;  i 的值为 5。

  • 将整型数据-->实型变量,数值不变。

          float f  ;  f=23;  (先23→23.00000 再存储在f 中) 
          double  d;  d=23; (先23→23.000000000000000再存储在d中)

  • 将字符数据-->整型变量,将字符数据放到整型变量低8位中

          int i;char ch = '0';        i = ch;   // i = 48        

  • 将整型变量->字符数据,将整型变量低8位放到字符数据中

          int i = 4656;char ch;        ch = i;   // ch = 48 

解释:4656转换为二进制为:1 0010 0011 0000  整型占4字节 字符占1字节(8位) 

         低8位放到字符数据中:0011 0000 转换为十进制就是48

(3)复合的赋值运算符:(共十个)
  += ,  -= ,  *= ,  /=  ,   %= , 
       <<= ,  >>= ,  &= ,  ^= ,  |=

(4)赋值运算符结合率为:“自右而左”。
例如: a=b=c=5               a=(b=(c=5))   a,b,c值都是5
            a=5+(c=6)            c值为6, a值为5+6 (即11)
            a=(b=4)+(c=6)     b值为4,c值为6,a值为4+6 (即10)
            a=(b=10)/(c=2)    a值为5

(5)练习

a+=a–=a*a    
 若 a为5,则赋值表达式的值为?
答案:–40。


计算方法: 
a+=(a- =a*a)
a=a-a*a     (即a= 5-5*5,即a=-20)
a=a+(上述表达式结果)
即a= (-20)+(-20)
即a=  - 40  

3.关系运算符和关系表达式

(1)关系运算符用于两个数值之间的比较运算。C语言提供6种关系运算符:
      <、<=、>、>=、       优先级相同高
                         ==、!=                    优先级相同低
 
(2)关系运算符的结合率为:“自左而右”。


c > a+b          等效于     c > (a+b)

 a > b != c       等效于     (a > b) != c
 a == b < c      等效于     a == (b < c)  
 a = b > c         等效于     a = (b > c) 
 
(3)关系表达式的值是一个逻辑型的值,即只有两个值(真和假)。

C语言是用1作为真,用0作为假。但是进行运算时,非0即认为真,0才认为假。

而表达式的结果为真时,给出真值1。为假时,给出假值0。
 例1:有int x=2,y=3,z=5;
             则:x>y     结果为0。
                     z>=y    结果为1。 
                     z==y    结果为0。
 


4.逻辑运算符和逻辑表达式

(1)优先级: !>&&>||

用逻辑运算符将关系表达式或逻辑量连接起来的式子。
运算结果为:“真”或“假”值。
系统在运算时以非0即为真,以0为假。
 
例如:  4  && 0 || 2   的值为1
                 5  && !0     的值为1
 
逻辑、关系、算术和赋值运算符的优先级为:
 
例如:(a>b)&&(x>y)           可以写成  a>b&&x>y
              (a==b)||(x==y)          可以写成    a==b||x==y
              (!a)||(a>b)                  可以写成   !a||a>b
              5>3&&2||8<4-!0          的值为    1
              'c'&&'d'                        的值为      1      
 


5.条件运算符和条件表达式

条件运算符:  ? : 它是唯一的一个三目运算符。


6.逗号运算符和逗号表达式

逗号运算符:  ,
  格式: 表达式1, 表达式2, 表达式3, LL, 表达式n
        优先级: 最低
        从左向右计算每个表达式的值,逗号表达式的值为表达式n的值(最后一个逗号右边的值)

(二)自增自减运算符

自增、自减运算符:++ ,  --  (使变量的值增1或减1)
例如:  ++i  ,  --i     (先自增或自减再使用)
      i++  ,   i--    (先使用后自增或自减)
 
若有 int i=3,j;   则:
① j=++i;   i的值为3+1 即4 , j的值为4;
② j=i++;     j的值为3 ,  i的值为3+1=4 。 
又如:i=3;
            printf("%d",++i);    /*输出为4*/ 
            printf ("%d", i++);    /*输出为3*/

例如:

  • z = i+++j;  i = 1,j = 2则i = ?,j = ?z = ?

       z = (i++) + j     i = 2    j = 2    z = 1 + 2 = 3

  • z = x++, y++, ++y; x = 1, y = 1;则 x = ?,y = ?,z = ? 

x = 2   y = 2   z = 1,1,3   z = 3

  • j = ++i + ++i + ++i; i = 1; j = ?

j = 10

三.数据输入输出

(一)数据输出

1.putchar()函数

功能:向终端输出一个字符。
格式:   putchar (ch)

#include <stdio.h>
int main()
{
	 char a,b,c;  
      a='B';b='O';c='Y';
       putchar(a);
       putchar(b);
       putchar(c);
       putchar('\n');
}

结果:BOY(换行)

2.printf()函数

 %【+/-】【0】【l】【m.n】【格式字符】


【0】不指定时:位置空白,指定时,不使用的位置用0代替

【+/-】设置输出的结果的对齐方式 +:是默认的方式可不写 右对齐  -:左对齐

#include <stdio.h>

int main()
{
    int a = -1;  
    printf("%d,%u,%o,%x\n",a,a,a,a);//-1,2^32-1,37777777777,ffffffff

    int b = 12;
    printf("%5d\n",b);//   12
    
    int c = 123456;
    printf("%5d\n",c);//123456

    float af = 1.12345;
    printf("%5.2f\n",af);// 1.12

    return 0;
}

结果:

  • -1,4294967295,37777777777,ffffffff               

4294967295的二进制为:32个1  -1(负数高位为1 以补码形式存在)的二进制为1000 0000 ... 0001  取反加一(得原码)为32个1           37777777777 八进制            ffffffff 十六进制

  •    12

(空三个)12

  • 123456

数据宽度超出规定宽度仍能正常打印

  •  1.12

(空一个)12   小数点也算一个宽度

%4.2 %3.2 %2.2 ...  都可以输出12

(二)数据输入

1.getchar()函数

功能:  从输入设备输入一个字符。
格式:   getchar ()
 

#include  <stdio.h>
int  main()
{
    char  c;
    c=getchar();
    putchar(c);
}    

输入:12  输出:1

2.scanf()函数


功能:输入若干个任意类型的数据。
格式:scanf("格式控制",参数1,参数2,参数3, LL)
格式说明:由%后跟一个格式字符组成。中间可插入l、h、m、*几个附加字符。
普通字符:照原样输入。

  • 例1 :scanf("%3d%3d",&a,&b);

若输入数据格式为:123456  
则将123赋给a,456赋给b。
 

  • 例2:scanf("%c%c%c",&c1,&c2,&c3);

若输入数据格式为: a   b   c  
则将a赋给c1 空格赋给c2,b赋给c3。
 

  • 例3:scanf("%d%c%f",&a,&b,&c);

若输入数据格式为:1234a123o.26
a:1234     b:a    c:123
 

  • 例4:scanf("%2d   %*3d   %2d",&a,&b);

 若输入数据格式为:  12   345   67       
则将12赋给a,   67赋给b。
 

猜你喜欢

转载自blog.csdn.net/lishasha5/article/details/83148189