1.单目,双目,三目
单目:i++ --i ~i !i
双目:即运算符位于两个表达式之间 a+b
三目:1 ? printf(“true”) : printf(“false”)
2.赋值运算符(不是简单的等式) <注意区分赋值和初始化的异同>
int i=0;//这是初始化(伴随定义过程中给值或者说变量刚分配好空间即给值)
i=3; //这就是赋值:将变量的旧有的值(不是垃圾值)清除,<先了解>动态空间的指针变量还可能把旧的空间回收(C++里的对象的赋值),再分配一个新的空间,再在这个新空间里给上新值.
赋值语句:把某个常量或变量或表达式(包含有返回值的函数)的值赋值给另一个变量。它表示“等于”,而不是“是否相等”。 它的符号是”=”, 而不是“==”
不同于数学上的:x^2+y^2=z^3 x+3=5
已赋值的变量我们称为左值,一般它出现在赋值语句的左边;产生值表达式我们称为右值,一般它出现在赋值语句的右边。常数只能作为右值。
赋值语句的左值是不允许表达式存在的
3.算术运算符
+单目正
-单目负 取反,有点类似!,-用在数学运算上
+ - * /(除数不能为0) %(取余,除数不能为0)
4.逻辑运算符:真、假
&& 逻辑与 都成立为真
| | 逻辑或 只要有真就是真
! 逻辑非 将对象假的变真,真的变假(不会改变实际涉及变量的值,跟~类似,不像自增自减)
C语言没有BOOL类型,只有非0为真(别忘记负数),0为假
短路现象
5.关系运算符:(关注:大 小 结果:真 假<整型>)
> < >= <= != ==
在条件判断语句里,尽可能将类似if(a==32); 这样的语句反过来写,写成if(32==a);以杜绝可能存的隐患
6.自增自减运算符
++a; --a; 变量自身先加减1,后参与其它运算
a--; a++; 变量自身先参与其它运算,整个表达式结束后再自身加减1
在复杂表达式里,对它的理解(a+++b---c)
注意不要进行++a++;运算
7.复合赋值运算符
+=加法赋值 -= *=
/= %= <<= >>=
&= |= ^=
普例:a+=2;==> a=a+2; 完全等价?不是
a+=2; +=只是进行一次运算
a=a+2; 先进行a+2,结果存在临时空间(只读)里,后再把临时空间里的值取出来赋值给a.
由此推向其它复合赋值运算,都是同理
8.条件运算符
<表达式1>?<表达式2>:<表达式3>
先进行表达式1的运算或调用,如果逻辑上成立或为真,则执行表达式2的语句,否则执行表达式3
9.逗号运算符
< <表达式1>,<表达式2>, <表达式3>, <表达式4>, <表达式5>… >;
Z=(a=0,--b,++c,d=3,printf(„Hi“),while(a!=1)i++,e=5,f,++++--g);
int a,b,c=9,d,e,f; //不是所有用到逗号的语句都是逗号表达式
多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个大的表达式的值是最后一个表达式的值。
逗号表达式运算优先级最低
10. 位运算符 (信号灯游戏)
&位逻辑与 两个为1才是1
|位逻辑或 只要有一个为1就为1 (包含了两个都为1也为1的情况)
^位逻辑异或 只要不同就为1(如果都相同,不管是不是1,都为0)<位逻辑异>
~取补(位取反)
<< >> 左移 右移 跟乘除的关系
11.运算符的优先级和结合性
结合性:又称为计算顺序,它决定组成表达式的各个部分是否参与计算以及什么时候计算(大家优先级一样时:自左向右,自右向左)
优先级 运算符 结合性
最高 函数() //Func(int a) 数组[] -> . 自右向左
1 ! ~ ++ -- + - * & sizeof (单目) 自右向左
2 * / % (双目) 自左向右
3 + - 自左向右
4 << >> 自左向右
5 == != >= <= 自左向右
6 & ^ | (双目) 自左向右
7 && | | 自左向右
8 ?: 整体自右向左(内部自左向右)
9 = += *= %= &= <<= >>= 自右向左
最低 ,逗号 自左向右
助记:目数越多,优先级越低