一、关系运算符
关系运算符在使用时,它的的两边都会有一个表达式,比如变量、数值、加减乘除运算等,关系运算符的作用就是判明这两个表达式的大小关系。注意,是判明大小关系,不是其他关系。
C语言提供了以下关系运算符:
关系运算符的两边可以是变量、数据或表达式,例如:
1) a+b > c-d
2) x > 3/2
3)'a'+1 < c (c是变量)
关系运算符也可以嵌套使用,例如:
1)a>(b>c)
2) a != (c==d)
关系运算符的运算结果只有 0 或 1。当条件成立时结果为 1,条件不成立结果为 0。例如:
#include <stdio.h>
int main(void)
{
int a = 10, b = 5;
printf("结果:%d\n", a>b);
return 0;
}
结果:
结果:1
5>0 成立,其值为 1;
34-12>100 不成立,其值为 0;
(a=3)>(b=5) 由于3>5不成立,故其值为 0。
我们将运算结果 1 称为“真”,表示条件成立,将 0 称为“假”,表示条件不成立。
对于含多个关系运算符的表达式,如 k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。注意:==才表示等于,而=表示赋值,切勿混淆。
二、算术运算符
注意:
减号也是负号,比如 -a 是取变量 a 的相反数。
取模运算要求左右两边操作数必须是整型数据。
自加和自减运算不仅可以对整型操作,也可以对浮点数、指针操作。
前后缀运算:
前缀自加自减运算:先进行自加自减,再参与表达式运算 b = ++i b=--i;
后缀自加自减运算:先参与表达式运算,在进行自加自减 b=i++ b = i--;
取整取余案例:
#include <stdio.h>
int main(void)
{
int a = 3, b = 2;
printf("b/a = %d\n", b/a); //2/3
printf("b/a = %d\n", b%a); //2%3
return 0;
}
输出:
b/a = 0
b/a = 2
自加自减案例:
#include <stdio.h>
int main(void)
{
int i = 5, j = 8;
int a = 1, b = 7;
a = i++; //先赋值再 a = 5 , 这行代码执行后 i = 6
b = ++j; //先加j = 9, b = 9
a++; //这行代码执行后 a = 6
++b; //这行代码执行后 b = 10
printf("i = %d\n", ++i); //先加完再打印后,i = 7(打印值)
printf("j = %d\n", ++j); //先加完再打印后,j = 10(打印值)
printf("a = %d\n", a+1); //6+1
printf("b = %d\n", b = a++); //b = a(b的值为6) ,执行代码后a = 7
return 0;
}
输出:
i = 7
j = 10
a = 7
b = 6
三、逻辑运算符
在高中数学中,就学过逻辑运算,例如p为真命题,q为假命题,那么“p且q”为假,“p或q”为真,“非q”为真。在C语言中,也有类似的逻辑运算:
与运算(&&)
参与运算的两个表达式都为真时,结果才为真,否则为假。
或运算(||)
参与运算的两个表达式只要有一个为真,结果就为真;两个表达式都为假时结果才为假。
非运算(!)
参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果为真。
四、位运算符
位运算符操作的对象是数据中的每一位
位逻辑反:~0110 1111 结果: 1001 0000
位逻辑与:
1 0 1 1 1 0 0 1
& 0 1 1 1 0 1 0 0
----------------------------
0 0 1 1 0 0 0 0
位逻辑或:
1 0 1 1 1 0 0 1
| 0 1 1 1 0 1 0 0
----------------------------
1 1 1 1 1 1 0 1
位异或运算:相同为0,不同为1
1 0 1 0 1 1 0 0
^ 0 1 1 0 1 1 1 0
---------------------------
1 1 0 0 0 0 1 0
移位运算:移出去的不要,空出来的补零。
无符号数左移或者右移需要补0。
负数(补码)右移补1,左移补0。
五、三目运算符
表达式1?表达式2:表达式3
如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。
max = (a>b)?a:b;
该语句的语义是:如a>b为真,则把a赋予max,否则把b 赋予max。
注意: 条件运算符的结合方向是自右至左。
例如:
a>b?a:c>d?c:d
应理解为:
a>b?a:(c>d?c:d)
这也就是条件表达式嵌套的情形,即其中的表达式又是一个条件表达式。
六. 特殊运算符
赋值运算符( = ):
不能对数组赋值,不能对常量赋值
可以连续赋值,顺序从右到左
复合赋值符:
加减乘除:
a += n; 等价于 a = a+n;
a -= n; 等价于 a = a-n;
a *= n; 等价于 a = a*n;
a /= n; 等价于 a = a/n;
求余:
a %= n; // 等价于 a = a%n;
位运算:
a &= n; 等价于 a = a&n;
a |= n; 等价于 a = a|n;
a ^= n; 等价于 a = a^n;
a >>= n; 等价于 a = a>>n;
a <<= n; 等价于 a = a<<n;
除了上述10个复合运算符之外,生造别的复合运算符是非法的
七. 优先级与结合性:
(话说这玩意真有人记吗?平常不懂就括号,需要就查)