一、C语言篇——03. 运算符与表达式

01. 常用的运算符分类

运算符类型作用
算术运算符用于处理四则运算
赋值运算符用于将表达式的值赋给变量
比较运算符用于表达式的比较,并返回一个真值或假值
逻辑运算符用于根据表达式的值返回真值或假值
位运算符用于处理数据的位运算
sizeof运算符用于求字节数长度

02. 算数运算符

运算符术语示例结果
+正号+33
-负号-3-3
+10 + 515
-10 - 55
*10 * 550
/10 / 52
%取模(取余)10 % 31
++前自增a=2; b=++a;a=3; b=3;
++后自增a=2; b=a++;a=3; b=2;
前自减a=2; b=–a;a=1; b=1;
后自减a=2; b=a–;a=1; b=2;
#include <stdio.h>
int main()
{
    int a = 5;
    int b = 2;
    double c = a/b;
    printf("c = %lf\n",c);   //打印结果: 2.000000  不是我们想要的
    //两个数相除,想要得到小数,除数或被除数必须有一个是浮点数,否则会取整
        
    int d = a % b;   //a = 5,  b = 2;
    printf("d = %d\n",&d);  //打印结果1
    
    //后置++,先用后加,先执行完这个语句,a的值赋值给d,a再自加1
    d = a++;
    printf("d = %d\n",&d);  //打印结果5
    
    //前置++,先加后用,a先自加1,再执行这个语句,将a的结果赋值给d
    d = 1;
    a = 5;
    d = ++a;
    printf("d = %d\n",&d);  //打印结果6
    
    return 0;
}

03. 赋值运算符

运算符术语示例结果
=赋值a=2; b=3;a=2; b=3;
+=加等于a=0; a+=2;a=2;
-=减等于a=5; a-=3;a=2;
*=乘等于a=2; a*=2;a=4;
/=除等于a=4; a/=2;a=2;
%=模等于a=3; a%2;a=1;
#include <stdio.h>
int main()
{
    int a = 2;
    a += 2;  //a加上2后,在赋值给a,相当于 a = a + 2;
    
    //后面的类似
    return 0;
}

04. 比较运算符

运算符术语示例结果
==相等于4 == 30
!=不等于4 != 31
<小于4 < 30
>大于4 > 31
<=小于等于4 <= 30
>=大于等于4 >= 11

非0的数就是真,通常以1表示真

0就是假,以0表示假

#include <stdio.h>
int main()
{
    //因为 4 == 3为假, 所以结果为0
    printf("%d\n",4 == 3);
    
    //因为 4 > 3为真, 所以结果为1
    printf("%d\n",4 > 3);
    
    //因为 4 != 3为真,所以结果为1,
    printf("%d\n",4 != 3);
    
    return 0;
}

05. 逻辑运算符

运算符术语示例结果
!!a如果a为假,则!a为真; 如果a为真,则!a为假。
&&a && b如果a和b都为真,则结果为真,否则为假。
||a || b如果a和b有一个为真,则结果为真,二者都为假时,结果为假。
#include <stdio.h>
int main()
{
    //因为4 == 3为假,所以!(4==3)为真,结果是1
    printf("%d\n",4 == 3);
    
    //&&,左右结果都是真,整体结果就为真
    printf("%d\n",1 && 0);  //结果是:0
    
    //||,只要有一边是真,结果就是真
    printf("%d\n",1 || 0);   //结果是:1
    return 0;
}

短路规则(编译器优化)

||运算符:左边为真,右边不执行

&&运算符:左边为假,右边不执行

06. 位逻辑运算符

按位取反 ~

一元运算符~,将每一位的1变为0,将0变为1

~(10011010)
  01100101

假设a是一个unsigned char,已赋值为2.在二进制中,2是00000010.于是-a的值为11111101或者253。请注意该运算符不会改变a的值,a仍为2。

unsigned char a = 2;   //00000010
unsigned char b = ~a;  //11111101
printf("ret = %d\n", a); //ret = 2
printf("ret = %d\n", b); //ret = 253

按位与 &

二元运算符&。对于每个位,只有两个操作数的对应位都是1时结果才为1。(都为1才是1,有一个是0结果为0)

   (10010011) 
 & (00111101) 
 = (00010001)

C也有一个组合的位与-赋值运算符:&=。下面两个将产生相同的结果:

val &= 0377
val = val & 0377

按位或 |

二元运算符|。对于每个位,如果其中任意操作数中对应的位为1,那么结果位就为1。(有一个为1结果就是1,都为0才是0)

   (10010011)
 | (00111101)
 = (10111111)

C也有组合位或-赋值运算符: |=

val |= 0377
val = val | 0377

按位异或 ^

二元运算符^。对于每个位,如果操作数中的对应位数字一样(都是1或者都是0),则结果为0,反之,作数中的对应位数字不一样,结果为1(相异为1)

   (10010011)
 ^ (00111101)
 = (10101110)

C也有一个组合的位异或-赋值运算符: ^=

val ^= 0377
val = val ^ 0377

用法

打开位

一、10011010 的第二位 置1  

  (10011010)
| (00000100)
= (10011110)

二、10011010 全部位 置1

  (10011010)
| (01100101)
= (11111111)

关闭位

10011010 全部位 置0

  (10011010)
& (01100101)
= (00000000)

转置位

10010011 ^ 0xff  取反

  (10010011)
^ (11111111)
= (01101100)

交换两个数

a = a ^ b
b = a ^ b
a = a ^ b

07. 移位运算符

左移 <<

左移运算符<<将其左侧操作数的值的每位向左移动,移动的位数由其右侧操作数指定。空出来的位用0填充,并且丢弃移出左侧操作数末端的位。在下面例子中,每位向左移动两个位置

(10001010) << 2
  	↓
(00101000)

左移一位相当于 原值*2

1 << 1 = 2;
2 << 1 = 4;
4 << 1 = 8;
8 << 2 = 32

右移 >>

右移运算符>>将其左侧的操作数的值每位向右移动,移动的位数由其右侧的操作数指定。丢弃移出左侧操作数有段的位。对于unsigned类型,使用0填充左端空出的位。对于有符号类型,结果依赖于机器。空出的位可能用0填充,或者使用符号(最左端)位的副本填充。

//有符号值
(10001010) >> 2
(00100010)     //在某些系统上的结果值

(10001010) >> 2
(11100010)     //在另一些系统上的结果

//无符号值
(10001010) >> 2
(00100010)    //所有系统上的结果值

用法

移位运算符能够提供快捷、高效(依赖于硬件)对2的幂的乘法和除法。

number << nnumber乘以2的n次幂
number >> n如果number非负,则用number除以2的n次幂

08. 运算符优先级

优先级运算符结合方向
1[] () . ->左到右
2- ~ ++ – * & ! (类型) sizeof右到左
3/ * %左到右
4+ -左到右
5<< >>左到右
6> >= < <=左到右
7== !=左到右
8&左到右
9^左到右
10|左到右
11&&左到右
12||左到右
13? :右到左
14赋值运算符右到左
15, 逗号运算符左到右

09. 类型转换

#include <stdio.h>
int main()
{
    //隐式转换
    double a;
    int b = 10;
    
    //字节小的类型转字节大的类型,隐式转换,编译器自动转换
    //b自动转换成double型,再给a赋值
    a = b;
    
    //强制转换
    double a = 10;
    a = (int)a;  //将a强制转换为int型
    
    int i = 0;
    //%u打印,所以它需要一个unsigned int型,将i进行强转成unsigned int型
    printf(" %u \n",(unsigned int)i);
    
    return 0;
}

强制类型转换原则:占用内存字节少的类型,向占用内存字节数多的类型转换,保证精度不降低。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言运算符的优先级如下所示: 1. 后缀运算符:() \[\] -> 2. 一元运算符:++ -- + - ! ~ (type)* & sizeof 3. 乘除余运算符:* / % 4. 加减运算符:+ - 5. 移位运算符:<< >> 6. 关系运算符: < <= > >= 7. 相等运算符:== != 8. 位与运算符:& 9. 位异或运算符:^ 10. 位或运算符:| 11. 逻辑与运算符:&& 12. 逻辑或运算符:|| 13. 条件运算符:?: 14. 赋值运算符:= += -= *= /= %= >>= <<= &= ^= |= 15. 逗号运算符:, 需要注意的是,运算符的优先级决定了它们在表达式的计算顺序。在表达式,较高优先级的运算符会优先被计算。例如,对于表达式e = (a + b) * c / d,先计算括号内的加法,然后乘法,最后除法。\[1\]\[2\] 另外,C语言还有一些特殊的运算符,如sizeof运算符用于获取变量或类型的大小,逗号运算符用于依次计算多个表达式并返回最后一个表达式的值。\[2\] 总结起来,C语言运算符的优先级可以根据上述优先级表来确定,根据需要可以使用括号来改变运算的顺序。\[2\] #### 引用[.reference_title] - *1* *2* [C语言——运算符优先级](https://blog.csdn.net/liu17234050/article/details/104176911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【C语言基础】-运算符](https://blog.csdn.net/weixin_44247448/article/details/124077281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值