5.3 挑几个运算符来讲
常用的运算符除了加减乘除 (+-*/) 外, 还有如下:
注意: 以下运算符之间用逗号隔开, C 语言中也有逗号运算符, 这里不讲逗号运算符.
1. 赋值运算符 =,+=,*=
2. 一元运算符 ++, --
3. 相等运算符 ==,!= , 关系运算符 <,>,<=,>=
4. 条件运算符 ?:
6. 位运算符 &, ^, | ,! 逻辑运算符 &&, ||, 移位运算符>>, <<5.3.1 赋值运算符
给变量赋值, 可以通过 "=" 连接, 将右边的数值赋值给左边的变量, 如:
- int a = 10;
- int b;
- b = 10;
赋值运算符中还能够做加减乘除与或非等等的运算, 如:
- #include <stdio.h>
- void main()
- {
- int a = 10;
- a += 100;
- printf("a = %d \n", a);
- }
运行结果为: a = 110;
上述 a += 100 等价于 a = a + 100; 以此类推, a -= 100 等价于 a = a - 100; a *= 100; 等价于 a = a * 100 ...... 后续讲到的 &,^,| 等位运算符也能结合 "=" 凑合着来使用.
5.3.2 一元运算符, 增增, 减减
C 语言中一元运算符, 有加加 ++ 和减减 --, 但是没有乘乘 ** 和除除 //. 因为 ++ 的意思是变量加一,-- 的意思是变量减 1, 所以没有必要 ** 和 //, 因为变量乘以 1 和除以 1 都是等于变量本身.
因为 ++ 和 -- 的意思类似, 所以就挑 ++ 来讲解.
++ 可以放在变量前面, 也可以放在变量后面, 意思不同, 写法如下:
- int a = 10;
- ++a;
- a++;
++a 是先进行自增 1 的运算, 然后进行其它的操作, a++ 是先进行其它操作, 然后再进行自增 1 的运算, 这么说不好理解, 如下代码:
- #include <stdio.h>
- void main()
- {
- int a = 0;
- int b = 10;
- a = ++b;
- printf("a = %d b = %d\n", a, b);
- }
运行结果是: a = 11 b = 11; 代码中, a 在变量声明的时候赋值为 0,b 赋值为 10, 在运算表达式中, a = ++b; 先进行 b 的自增运算, 这时候 b 就变为了 10+1 = 11, 然后赋值给 a,a 的取值就变为 11 了, 再看下一段代码:
- #include <stdio.h>
- void main()
- {
- int a = 0;
- int b = 10;
- a = b++;
- printf("a = %d b = %d\n", a, b);
- }
运行的结果是: a = 10 b = 11; 代码中, a 在变量声明的时候赋值为 0,b 赋值为 10, 在运算表达式中, a = b++; 先进行 a = b 的赋值运算, 然后再进行 b = b + 1 的自增运算, 所以 a 的取值就是 10,b 的取值为 11.
如果 ++b 和 b++ 是完整的一句表达式,
注意: 完整的一句表达式以分号; 作为为这句结束的标识.
也就是,
- #include <stdio.h>
- void main()
- {
- int a = 0;
- ++a;
- printf("a = %d\n", a);
- }
和
- #include <stdio.h>
- void main()
- {
- int a = 0;
- a++;
- printf("a = %d\n", a);
- }
它们的运行结果是一致的, 因为完整的一句表达式中, 没有其它的操作, 所以就只做了自增 1 的操作. 所以请记住:++a 是先进行自增 1 的运算, 然后进行其它的操作, a++ 是先进行其它操作, 然后再进行自增 1 的运算
熟悉了以上概念就可以思考以下结果:
- int a, b, c, d,e, f, g, h;
- a = 10;
- b = (a++) + (a++) + (a++);
- a = 10;
- c = (++a)+ (++a) + (++a);
- a = 10;
- d = (++a) + (a++) + (a++);
- a = 10;
- e = (a--) + (a--) + (a--);
- a = 10;
- f = (--a)+ (--a) + (--a);
- a = 10;
- g = (--a) + (a--) + (a--);
- a = 10;
- h = (a--) - (a++) + (++a) - (--a);
请问 b,c,d,e,f,g,h 的取值为多少? 不理解的话可以再次回顾刚才的概念, 然后加 printf 语句来核对结果.
5.3.3 和 bool 值有关的相等运算符与关系运算符
第四章的时候有讲过一种数据类型叫做 bool, 它的取值就两种, true,false. 计算机语言是二进制, 内存中, true 等于 1,false 等于 0, 如以下代码,
- #include <stdio.h>
- #include <stdbool.h>
- void main()
- {
- printf("%d , %d \n", true, false);
- }
运行结果为 1 , 0; 所以更加清晰的了解了, 真 true 的值为 1, 假 false 的值为 0.
注意: 需要声明头文件 stdbool.h 才可以使用 bool 变量, 才可以打印 true 和 false 的值.
有了以上概念, 就可以理解相等运算符的取值了, 比如两个等于号 == , 意思为这两个取值是否相等, 是的话运算结果值为 1, 不是的话运算结果值为 0.
注意: 千万不要把赋值运算符 = 与相等运算符 == 混淆了! 后续讲解条件语句会再提到这点.
感叹号加上等号 != , 意思为这两个值是否不相等, 是的话运算结果值为 1, 不是的话运算结果值为 0. 代码如下:
- #include <stdio.h>
- #include <stdbool.h>
- void main()
- {
- int a = 10;
- int b = 5;
- bool c;
- c = (a == b);
- printf("c = %d \n", c);
- }
运行结果为, c = 0; 所以 c 的值就说明了 a == b 是假, 也就是 a 和 b 相等是不成立的.
注意: 读者可以自行改代码, 把 b = 5 改为 b = 10 , 就能发现, c 的值变为 1 了, 说明这时 a 等于 b 成立.
把代码稍微修改一下, 把 a == b 改为, a != b 如下:
- #include <stdio.h>
- #include <stdbool.h>
- void main()
- {
- int a = 10;
- int b = 5;
- bool c;
- c = (a != b);
- printf("c = %d \n", c);
- }
运行结果为, c = 1; 说明 a 不等于 b 是成立的, 所以运算结果值取 1.
同理, 小于号 <取运算结果, 左边是否小于右边, 是的话运算结果值取 1, 否的话运算结果值取 0;
小于等于号 <= , 大于号> , 大于等于号>= 也都是这样的用法.
5.3.4 条件运算符
问号加上冒号就组成了条件运算符的表示 ?: , 使用方式一般套用以下格式:
条件 ? 表达式 1 : 表达式 2
条件其实也是一种表达式, 只不过条件的取值是 bool 值, 如果取值是 true(1), 运算表达式 1, 如果取值是 false (0), 运算表达式 2, 代码如下,
- #include <stdio.h>
- #include <stdbool.h>
- void main()
- {
- int a = 10;
- int b = 5;
- (a> b) ? (++a) : (++b);
- printf("a = %d, b = %d\n", a, b);
- }
运行结果为: a = 11, b = 5; 在表达式 (a> b) ? (++a) : (++b); 中, 先判断 a 是否大于 b, 结果是大于, 所以选择问号后面的表达式 ++a 来运算.
后续讲到宏定义的时候会再次涉及条件运算符做个小功能, 这里 mark 一下.
来源: https://www.cnblogs.com/songsongman/p/11353178.html