/* 第三讲 运算符与表达式 1. 运算符: 算术运算符:+ - * /(除) %(取余) 关系运算符:> >= < <= !=(不等于) ==(等于) 逻辑运算符:!(非) &&(并且) ||(或) 赋值运算符: = += *= /= -= 优先级别:算术 > 关系 > 逻辑 > 赋值 2. 除法与取余运算符 除法/的运算结果和运算对象的数据类型有关。 两个数都是int,则商就是int。 若商有小数,则截取小数部分。 被除数和除数中只要有一个都是浮点型数据,则商也是浮点型 不截取小数部分。 如:16/5 == 3 16/5.0 == 3.20000 -13/4 == -4 -13/-3 == 4 3/5 == 0 5/3 == 1 取余%的运算对象必须是整数,结果是整除后的余数, 其余数的符号与被除数相同。 如:13%3 == 1 13%-3 == 1 -13%3 == -1 -13%23 == -13 3%5 == 3 3. 逻辑运算符 !(非) &&(并且) ||(或) !真 假 !假 真 真&&真 真 //一假全假 真&&假 假 假&&真 假 假&&假 假 真||假 真 //一真全真 假||真 真 假||真 真 假||假 假 C语言对真假的处理: 非零即真,零是假 */ #include<stdio.h> int main(void) { int i = 10 ; int k = 20 ; int m ; m = (1/2) && (k=5) printf("m = %d,k = %d\n",m,k) ; //&& 左边的表达式为假 右边的表达式肯定不会执行 //|| 左边的表达式为真 右边的表达式肯定不会执行 return 0 ; } 4. 对初学运算符的一些建议 1. 不用刻意的去记忆,用的时间长了,自然就会了。 2. 关于运算优先级,可以用括号表示优先级即可。 int k = (3+2*4) && (5||6-4) * 6 ; 5. 自增/自减 运算符 分类: 前自增 —— ++i 后自增 —— i++ 前自增和后自增的异同 相同: 最终都使i的值加1 ; 不同: 前自增整体表达式的值是i+1后的值 后自增整体表达式的值是i+1前的值 为什么需要自增? 为了使 代码更精炼,自增的速度更快 学习自增要明白的几个问题 1. 我们编程时应该尽量屏蔽掉前自增和后自增的差别 2. 自增表达式最好不要作为一个更大的表达式的一部分来使用 换言之,i++和++i单独成一个语句,不要把他作为一个完整复合语句 的一部分来使用。 如:int m = i++ + ++i + i + i++ ; //这样写不但是不规范,而且是不可以移植的代码 printf("%d %d %d,"i++,++i,i) ; //同上 6. 三目运算符 格式: A?B:C 等价于 if (A) B ; else C ; 7. 逗号表达式 格式: (A,B,C,D) 功能: 从左到右执行 最终表达式的值是最后一项的值 8. 位运算符 & —— 按位 于 && —— 逻辑与(也称为且) && 和 & 的含义完全不同 1&1 = 1 1&0 = 0 0&1 = 0 0&0 = 0 5&7 = 5 21&7 = 5 5&1 = 1 5&10 = 10 | —— 按位 或 || —— 逻辑或 ||与|的含义完全不同 1|0 = 1 1|1 = 1 0|1 = 1 0|0 = 0 ~ —— 按位 取反 ~i 就是把i变量所有的二进制位取反 ^ —— 按位 异或 相同为零,相异为一 1^0 = 1 0^1 = 1 1^1 = 0 0^0 = 0 << —— 按位 左移 i<<3 表示把 i的所有二进制位左移3位,右边补零 左移n位 相当于乘以2的n次方,前提是数据不会丢失 >> —— 按位 右移 i>>3 表示把 i的所有二进制位右移3位,左边一般是零,当然也可以补1 右移n位相当于除以2的n次方,前提是数据不会丢失 位运算的现实意义 通过位运算符,可以对数据的操作精确到每一位
转载于:https://www.cnblogs.com/lx17746071609/p/10216218.html