时间:2022-12-04 12:55:37 | 栏目:C代码 | 点击:次
C语言中支持下面4种类型的运算
| 运算类型 | 运算符 |
| 四则运算 | +,-,*,/,% |
| 关系运算 | <,>,<=,>=,==,!= |
| 逻辑运算 | &&,||,! |
| 位运算 | &,|,^,>>,<<,~ |
(+,-,*,/,%)

注意:
C语言中的除法运算,其除数不能为0
下面通过一段程序感受一下:
#include <stdio.h>
int main()
{
int a = 5;
int b = 2;
double c = 3;
c = a / b;
printf("c = %f\n", c);
c = a % b;
printf("c = %f\n", c);
return 0;
}
下面为输出结果:

通过上面的代码,可以得到一些小结论:
(<,>,<=,>=,==,!=)

如上面的图片所示,c 的值就为0
下面通过一段代码,感受一下:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 3;
c = a != b;
printf("c = %d\n", c);
c = a - b >= a + b;
printf("c = %d\n", c);
c = (a < b) + (c < b);
printf("c = %d\n", c);
return 0;
}
下面为输出结果:

小技巧:如果不同类型的运算同时出现在一个表达式中,那么尽量使用括号()指明运算顺序。
运算优先级(优先级:四则运算 > 关系运算 > 赋值操作)
四则运算
关系运算
赋值操作
下面看一段代码,深入感受一下运算优先级:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a != b + a * b;
printf("c = %d\n", c);
return 0;
}
下面为输出结果,可以看出,c 的输出结果为1,为什么为1呢?这是由于乘法优先级大于加法优先级大于关系运算优先级,所以程序执行过程是这样,先计算 a * b,然后将 a * b 的结果 2 加上 b,得到4,最后再比较 a != 4,得到的结果当然为1啦,我们还可以通过反汇编来观察代码的执行过程。


c = a != b + a * b的汇编代码
所以如果想得到a != b 再加上a * b的结果,一定要记得加括号,如下:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = (a != b) + (a * b);
printf("c = %d\n", c);
return 0;
}
这样才能得到正确结果,如下所示:

小结:
逻辑运算(&&,ll,!)
| 左操作数 | 右操作数 | 结果 |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
| 左操作数 | 右操作数 | 结果 |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
逻辑运算中的短路法则
对于&&运算
对于||运算
取非运算(!)
单目运算(只需要一个操作数),运算结果为逻辑值
话不多说,上代码:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a && b;
printf("c = %d\n", c);
c = !(a - b) || (c < b);
printf("c = %d\n", c);
c = 10000;
c = !!c;
printf("c = %d\n", c);
return 0;
}
下面为运行结果:

位运算(&,|,~,^,<<,>>)
| 运算符 | 含义 | 示例 | 优先级 |
| ~ | 按位求反 | ~0101 -> 1010 | 1(高) |
| << | 左移:高位移出,低位补0 | 0011 << 1 -> 0110 | 2 |
| >> | 右移:低位移出,高位补符号位 | 0101 >> 2 -> 0001 | 2 |
| & | 按位与 | 0111 & 1100 -> 0100 | 3 |
| ^ | 按位异或:相同为0,不同为1 | 0111 ^ 1100 -> 1011 | 4 |
| | | 按位或 | 0111 | 1100 -> 1111 | 5(低) |
注:
1.按位与和逻辑与的计算法相同:两者为1,结果为1,否则为0
2.按位或和逻辑或的计算法相同:两者为0,结果为0,否则为1
位运算实例
代码如下:
#include <stdio.h>
int main()
{
printf("c = %d\n", 5 | 2);
printf("c = %d\n", 7 ^ 8);
printf("c = %d\n", 2 ^ 3);
printf("c = %d\n", (15 >> 2) & 13);
printf("c = %d\n", 173 ^ 60);
return 0;
}
运行结果如下:

这里需要特别注意:对某一位或者某几位取反可以用异或(^)运算,这在工程里常用!!!
运算优先级(优先级从上到下为由高到低)
小结
不同类型的本质在于:
占用的内存大小不同,如:short占用2字节,int占用4字节
表示具体数据的方式不同
位运算时需要明确的知道的事
如下面的一段代码:
short a = 1;
int b = 4;
int c = a | b;
printf("c = %d\n",c);
b为int类型,占4个字节,a为short类型,占2个字节。所以a要先要补符号位,由于a是正数,所以补0,这样就可以进行位运算了,得出c的结果为5。

下面来看一段代码:
#include <stdio.h>
int main()
{
short a = 1;
short b = 2;
int c = a - b;
c = c >> 4;
printf("c = %d\n", c);
c = c * -1 * 16 >> 4;
printf("c = %d\n", c);
printf("c = %d\n", 16 << 2);
return 0;
}
下面为输出结果:

小结论
类型补充小知识
再看一段代码:
#include <stdio.h>
int main()
{
char c = 'A';
short a = c;
int b = c;
printf("c = %c\n", c);
printf("c = %d\n", c);
printf("a = %d\n", a);
printf("b = %d\n", b);
c = 0x40;
printf("c = %x\n", c);
printf("c = %d\n", c);
c = c << 1;
printf("c = %d\n", c);
c = c << 1;
printf("c = %d\n", c);
return 0;
}
下面为输出结果:

需要注意的是,因为c为char类型,所以64左移1位后,用二进制表示为1000 0000,最高位的1表示符号位,所以就是-128。
小结