C语言学习(4) 运算符和表达式

1.1 理解掌握运算符

(1) 赋值运算符:
a. 单等号: = (从右往左)

double salary = 3200.0; //double类型的变量salary,且3200.0赋值给salary

b. 复合运算符: 如:%=、&= 、^= 、|=

 num %= 5;   // %=	
 num += 12;  // +=
  //求模且赋值运算符,求两个操作数的模赋值给左边操作数	
  //C %= A 相当于 C = C % A
 C &= 2;     //  按位与且赋值,C = C & 2
 C ^= 2;     // 按位异或且赋值运算符,C = C ^ 2
 C |= 2 ;    // 按位或且赋值运算符 ,C = C | 2

(2) 算术运算符:
a. 一元运算符:++、–

a.1  num++++num 如果单独是语句,则两者等价
a.2  num1 = num++//等价
      //num1 = num;
      //num ++;        

b. 二元运算符:+、-、*、/、%

num = num1 + num2;

(3) 关系运算符:可以比较大小、高低、长短
<、>
>=、<=
==(恒等)、!=(不等)

    printf("%d\n",8==9);
    printf("5 > 8吗?%d\n",5>8);
    printf("6 < 7吗?%d\n",6<7);

运算结果

0
5 > 8吗?0
6 < 7吗?1

(4) 逻辑运算符:
&& 并且 条件1 && 条件2
|| 或 条件1 || 条件2
! !条件

    //逻辑运算符      && || !
    printf("%d\n",5 > 9 && 4 < 7);

(5) 位运算符: &、|、~、^、
<<(左移,右侧空位补0)、
>>(右移,左侧空位补符号位)
>>>(无符号右移,左侧空位补0)

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
    A = 0011 1100
    B = 0000 1101
    A&B = 0000 1100
    A|B = 0011 1101
    A^B = 0011 0001
    ~A  = 1100 0011
    unsigned int a=60;         //0011 1100
    unsigned int b=13;         //0000 1101
    printf("a=%d,b=%d",a,b);   //输出a,b的值
    printf("\n");
    a=a^b;                     //a=a^b=0011 0001
    b=a^b;                     //b=a^b=0011 1100
    a=a^b;                     //a=a^b=0000 1101
    printf("a=%d,b=%d",a,b);   //输出a,b的值

运算结果:

a=60,b=13
a=13,b=60

(6) sizeof运算符: 可以获得某一数据类型占用字节数
形式:sizeof(type name)
结果以字节为单位

    //sizeof
    printf("所占的空间%d字节!\n",sizeof(long long));
    printf("所占的空间%d字节!\n",sizeof(34.4));
    printf("所占的空间%d字节!\n",sizeof(34.4f));

运算结果:

所占的空间8字节!
所占的空间8字节!
所占的空间4字节!

(7) 条件运算符:三目运算用于条件求值,对第一个表达式作真/假检测,然后根据结果返回两外两个表达式中的一个。
<表达式1>?<表达式2>:<表达式3>
在运算中,首先对第一个表达式进行检验,如果为真,则返回表达式2的值;如果为假,则返回表达式3的值。

int a,b = 12;
a = (b > 0) ? b :- b;
printf("a = %d,b = %d",a,b);

运算结果:

a = 12,b = 12

(8) 逗号运算符:多个表达式可以用逗号分开(,) 其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。

//逗号运算符
int a1,a2,b = 3,d = 4,a = 1;
//整个表达式的值是最后一个表达式的值
a1 = (++b,a+1);
//三个表达式,这时的三个表达式为a2 = d+3,a--,b+2,(这是因为赋值运算符比逗号运算符优先级高)所以最终a2 = 7。
a2 = d+3,a--,b+2;
printf("a1 = %d,a2 = %d",a1,a2);

运算结果:

a1 = 2,a2 = 7

而且还发现了一个特别好玩的事情,把上面程序做一下修改,初值不变。

a1 = (++b,++a);
a3 = (++b,a++);
printf("a1 = %d,a3 = %d",a1,a2);

运算结果:

a1 = 2,a3 = 1

这也体现出优先级与++特殊性的问题。(自己觉得)a++ 输出 a 的值再自加,缓存 a 自加后的结果,用于下次进行与 a 相关的计算。
//希望读者自行考虑如果是单独一句a3 = (++b,a++);初值不变,则a输出值为多少。
(9) 指针运算符:用于取内容*和用于取地址&。
& 返回变量的地址。 &a; 将给出变量的实际地址。
* 指向一个变量。 *a; 将指向一个变量。

   int a = 4;
   int* ptr;    //指针变量
   ptr = &a;    // 'ptr' 现在= 'a' 的地址
   printf("a 的值是 %d\n", a);
   printf("*ptr 是 %d\n", *ptr);

运算结果:

a 的值是 4
*ptr 是 4

(10) 特殊运算符:()、[]、成员(->,.)等。

1.2 运算符优先级
(比较常用几个做比较)
() sizeof ++ –
!
算术运算符
关系运算符
&&
||
赋值运算符

2 表达式
运算符与操作数的组合

    int num = 10;
    //int result = num++ >11;
    int result = num++ > 11 && --num < 20;  //短路运算,当与前面的关系已经为假,就不再执行后面的--num
    printf("result= %d\tnum = %d\n",result,num);

暂时写到这吧!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值