#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c;
c = a + b;
printf("a+b=%d\n", c);
c = a - b;
printf("a-b=%d\n", c);
c = a * b;
printf("a*b=%d\n", c);
c = a / b;
printf("a/b=%d\n", c);
c = a % b;
printf("a%%b=%d\n", c);
return 0;
int main()
{
int a = 1;
printf("左移之后值为%d\n", a << 1);
int b = -1;
printf("右移之后值为%d\n",b>> 1);
return 0;
}
输出结果:
左移之后值为2
右移之后值为-1
右移之后为-1,说明在VS2022的环境下,右移操作符是算术右移
4. 位操作符
4.1 用法
位操作符与移位操作符一样作用对象是二进制序列,所以操作数自然只能为整数
下表显示了 C 语言支持的位操作符。假设变量 A 的值为 1,变量 B 的值为 2,则:
运算符
描述
实例
&
对两个操作数的每个二进制位执行逻辑与操作,如果两个相应的位都为 1,则结果为 1,否则为 0。
(A & B) 将得到 0
|
对两个操作数的每个二进制位执行逻辑或操作,如果两个相应的位都为 0,则结果为 0,否则为 1。
(A | B) 将得到 3
^
对两个操作数的每个二进制位执行逻辑异或操作,如果两个相应的位值相同,则结果为 0,否则为 1。
(A ^ B) 将得到 3
~
对操作数的每个二进制位执行逻辑取反操作,即将每一位的 0 变为 1,1 变为 0。
(~A ) 将得到 -2
4.2 代码实现
int main()
{
int a = 1;
int b = 2;
int c;
c = a & b;
printf("a&b=%d\n", c);
c = a | b;
printf("a|b=%d\n", c);
c = a ^ b;
printf("a^b=%d\n", c);
c = ~a;
printf("~a=%d\n", c);
return 0;
}
输出结果:
a&b=0
a|b=3
a^b=3
~a=-2
4.3 具体分析
a的原码,反码,补码:00000000000000000000000000000001
b的原码,反码,补码:00000000000000000000000000000010
a&b:00000000000000000000000000000000——>0
a|b:00000000000000000000000000000011——>3
a^b:00000000000000000000000000000011——>3
~a的原码:11111111111111111111111111111110
~a的反码:11111111111111111111111111111101
~a的补码:10000000000000000000000000000010——>-2
4.4 有趣的例题
题目: 不能创建临时变量(第三个变量),实现两个数的交换。
代码实现:
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d b = %d\n", a, b);
return 0;
}
int main()
{
int a = 1;
printf("a的大小为%d\n", sizeof(a));
int* p = &a;
printf("a的地址为%p\n",p );
int b = *p;
printf("b的值为%d\n", b);
a++;
printf("a的值为%d\n",a);
a--;
printf("a的值为%d\n", a);
printf("a的值为%d\n", !a);//0为假
float c = (float)a;
return 0;
}
输出结果:
a的大小为4
a的地址为010FFC08
b的值为1
a的值为2
a的值为1
a的值为0
6.3 前置与后置++,--的区别
首先我们先来看一段代码
int main()
{
int a = 1;
int b = a++;//后置++
printf("a=%d b=%d\n", a, b);
int c = ++a;//前置++
printf("a=%d c=%d\n", a, c);
int m = a--;//后置
printf("a=%d m=%d\n", a, m);
int n = --a;//前置--
printf("a=%d n=%d\n", a, n);
return 0;
}
输出结果:
a=2 b=1
a=3 c=3
a=2 m=3
a=1 n=1
通过上述代码,我们可以总结以下结论:
前置++,--先执行++或--,然后对等式左边进行赋值
后置++,--恰好相反,先对等式左边进行赋值,然后再++或--
6.4 易错题
题目:下例代码输出结果为?
int main()
{
int a = 12;
int b = 1;
int c = a - (b--);//1
int d = (++a) - (--b);//2
printf("c=%d d=%d\n", c, d);
return 0;
}
输出结果:
c=11 d=14
代码分析:
执行语句1时,因为b后置--,所以b先使用,后--,然后进行a-b运算,结果是 11,随后b 再自减,就变成了 0;最后再将a-b的结果(也就是11)交给 c,所以 c 的值是 11。
执行语句2之前,b 的值已经变成 0。对于d=(++a)-(--b),a 会先自增,变成 13,然后 b 再自减,变成 -1,最后再计算13-(-1),结果是 14,交给 d,所以 d 最终是 14。
7. 关系操作符
7.1 用法
关系操作符就是进行关系之间的比较
下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 1,变量 B 的值为 2,则:
运算符
描述
实例
==
检查两个操作数的值是否相等,如果相等则条件为真。
(A == B) 为假。
!=
检查两个操作数的值是否相等,如果不相等则条件为真。
(A != B) 为真。
>
检查左操作数的值是否大于右操作数的值,如果是则条件为真。
(A > B) 为假。
<
检查左操作数的值是否小于右操作数的值,如果是则条件为真。
(A < B) 为真。
>=
检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
(A >= B) 为假。
<=
检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。
(A <= B) 为真。
7.2 代码实现
int main()
{
int a = 1;
int b = 2;
if (a == b)
{
printf(" a 等于 b\n");
}
else
{
printf(" 不等于 b\n");
}
if (a < b)
{
printf(" a 小于 b\n");
}
else
{
printf(" a 不小于 b\n");
}
if (a > b)
{
printf(" a 大于 b\n");
}
else
{
printf(" a 不大于 b\n");
}
if (a <= b)
{
printf(" a 小于或等于 b\n");
}
if (b >= a)
{
printf(" b 大于或等于 a\n");
}
}
输出结果:
不等于 b
a 小于 b
a 不大于 b
a 小于或等于 b
b 大于或等于 a
8. 逻辑操作符
8.1 用法
下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:
运算符
描述
实例
&&
称为逻辑与运算符。如果两个操作数都非零,则条件为真。
(A && B) 为假。
||
称为逻辑或运算符。如果两个操作数中有任意一个数非零,则条件为真。
(A || B) 为真。
8.2 代码实现
int main()
{
int a = 1;
int b = 0;
if (a && b)
{
printf("a&&b条件为真\n");
}
else
{
printf("a&&b条件为假\n");
}
if (a || b)
{
printf("a||b条件为真\n");
}
else
{
printf("a||b条件为假\n");
}
}
输出结果:
a&&b条件为假
a||b条件为真
8.3 补充讲解
下列代码会输出什么
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
return 0;
}
输出结果:
a=1
b=2
c=3
d=4
代码分析
为什么会出现这个结果呢?这是因为逻辑与(&&)一遇见假(0)等式就为假,不会在往后运算
所以a先使用为0,等式为假,然后再++,a为1,其他变量不会改变
同样的道理,下列代码输出什么
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i=a++||++b||d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
return 0;
}
输出结果:
a=1
b=3
c=3
d=4
代码分析:
与逻辑与同样的道理,逻辑或(||)是一遇见真,整个表达式就为真,后面就不会执行
a先使用为0,++变为1,b先++变为3,在使用为真,后面表达式不执行
9. 条件操作符与逗号表达式
9.1 条件操作符
条件操作符又称为三目操作符,它的语法规则为:
如果条件为真 ? 则值为 X : 否则值为 Y
代码示例:
int main()
{
int a = 1;
int b = 1;
int c = a == b ? 20 : 10;
//含义:如果a=b为真,就将20赋给c,反之把10赋给c
return 0;
}
9.2 逗号表达式
逗号表达式,就是⽤逗号隔开的多个表达式。
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
exp1, exp2, exp3, …expN
代码示例:
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("c=%d",c);
return 0;
}