算术运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | -3 | -3 |
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 前自增 | a=2; b=++a; | a=3; b=3; |
++ | 后自增 | a=2; b=a++; | a=3; b=2; |
– | 前自减 | a=2; b=–a; | a=1; b=1; |
– | 后自减 | a=2; b=a–; | a=1; b=2; |
示例代码:
#include <stdio.h>
int main() {
// 2数相除,要想得到小数的结果,分子分母必须有一个数是小数
double c = 5/2; // 5, 2个都是整数,只会取整
printf("c1 = %lf\n", c);
c = 5.0/2;
printf("c2 = %lf\n", c);
c = 5/2.0;
printf("c3 = %lf\n", c);
int i = 0;
// 前置++
// 先加后用
int b = ++i;
printf("前置:b = %d, i = %d\n", b, i);
// 后置++
// 先用后加
i = 0;
b = i++;
printf("后置:b = %d, i = %d\n", b, i);
return 0;
}
运行结果:
c1 = 2.000000
c2 = 2.500000
c3 = 2.500000
前置:b = 1, i = 1
后置:b = 0, i = 1
赋值运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a=2; b=3; | a=2; b=3; |
+= | 加等于 | a=0; a+=2; | a=2; |
-= | 减等于 | a=5; a-=3; | a=2; |
*= | 乘等于 | a=2; a*=2; | a=4; |
/= | 除等于 | a=4; a/=2; | a=2; |
%= | 模等于 | a=3; a%=2; | a=1; |
示例代码:
#include <stdio.h>
int main() {
int a = 10;
a += 5;
printf("a = %d\n", a);
return 0;
}
运行结果:
a = 15
比较运算符
C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。
示例代码:
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 相等于 | 4 == 3 | 0 |
!= | 不等于 | 4 != 3 | 1 |
< | 小于 | 4 < 3 | 0 |
> | 大于 | 4 > 3 | 1 |
<= | 小于等于 | 4 <= 3 | 0 |
>= | 大于等于 | 4 >= 1 | 1 |
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
printf("%d\n", a == b);
printf("%d\n", a != b);
printf("%d\n", a > b);
printf("%d\n", a < b);
printf("%d\n", a >= b);
printf("%d\n", a <= b);
return 0;
}
逻辑运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 非 | !a | 如果a为假,则!a为真;如果a为真,则!a为假。 |
&& | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 |
|| | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |
示例代码:
#include <stdio.h>
int main() {
// 非0就是真,0就是假
// &&, 并且,左右2边结果为真,才为真
printf("%d\n", -1 && -2);
printf("%d\n", -1 && 0);
// || 或者, 左边或右边有1个为真,就是真,2个都为假才为假
printf("%d\n", -10 || 0);
printf("%d\n", 0 || 0);
// ! 取反
printf("%d\n", !(0 || 0));
// 短路规则
// && 左边为假,右边执行不到
0 && printf("我执行不到\n");
// || 左边为真,右边执行不到
1 || printf("我执行不到到\n");
return 0;
}
位运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
& | 按位与 | 011 & 101 | 2个都为1才为1,结果为001 |
| | 按位或 | 011 | 101 | 有1个为1就为1,结果为111 |
^ | 按位异或 | 011 ^ 101 | 不同的为1,结果为110 |
~ | 取反 | ~011 | 100 |
<< | 左移 | 1010 << 1 | 10100 |
>> | 右移 | 1010 >> 1 | 0101 |
示例代码:
#include <stdio.h>
#include <inttypes.h>
int main(){
uint8_t a = 3; // 0000 0011
uint8_t b = 10; // 0000 1010
printf("%d\n", a & b); // 0000 0010 十进制 2
printf("%d\n", a | b); // 0000 1011 十进制 11
printf("%d\n", a ^ b); // 0000 1001 十进制 9
uint8_t c = 10; // 0000 1010
// 补码符号位不动,其他位求反,最后整个数加1,得到原码
// 补码:1111 0101
// 反码:1000 1010
// 原码:1000 1011 最高位为符号位 -11
printf("%d\n", ~c);
printf("%d\n", c << 1); // 0001 0100
printf("%d\n", c >> 1); // 0000 0101
return 0;
}
案例需求:文章来源:https://www.toymoban.com/news/detail-685907.html
// 将变量a的第2位设置为1,其他位保持不变
uint8_t a = 0b10110011; // 0xb3;
// 将变量b的第2位、第6位设置为1,其他位保持不变
uint8_t b = 0b10110011; // 0xb3;
// 将变量c的第5位设置为0,其他位保持不变
uint8_t c = 0b10110011; // 0xb3;
// 将变量d的第0~3位设置为0,其他位保持不变
uint8_t d = 0b11111111; // 0xff;
// 将变量e的第2位取反,其他位保持不变
uint8_t e = 0b10110011; // 0xb3;
示例代码:文章来源地址https://www.toymoban.com/news/detail-685907.html
#include <stdio.h>
#include <inttypes.h>
int main() {
// 将变量a的第2位设置为1,其他位保持不变
uint8_t a = 0b10110011; // 0xb3;
a |= (1 << 2); // 或者 x = x | (1 << 2);
printf("%02x\n", a); // b7, 10110111
// 将变量b的第2位、第6位设置为1,其他位保持不变
uint8_t b = 0b10110011; // 0xb3;
b |= (1 << 2 | 1 << 6);
printf("%02x\n", b); // f7,11110111
// 将变量c的第5位设置为0,其他位保持不变
uint8_t c = 0b10110011; // 0xb3;
c &= ~(1 << 5);
printf("%02x\n", c); // 93,10010011
// 将变量d的第0~3位设置为0,其他位保持不变
uint8_t d = 0b11111111; // 0xff;
d &= ~(1 << 0 | 1 << 1 | 1 << 2 | 1 << 3);
printf("%02x\n", d); // f0,11110000
// 将变量e的第2位取反,其他位保持不变
uint8_t e = 0b10110011; // 0xb3;
e ^= (1 << 2);
printf("%02x\n", e); // b7, 10110111
return 0;
}
运算符优先级
- 不同的运算符默认具备不同的优先级
- 想把所有的运算符优先级都记住确实没必要,现用现查
- 当无法确定谁的优先级高时,加一个小括号就解决了
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | – |
1 | () | 圆括号 | (表达式)/函数名(形参表) | – | – |
1 | . | 成员选择(对象) | 对象.成员名 | 左到右 | – |
1 | -> | 成员选择(指针) | 对象指针->成员名 | 左到右 | – |
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
2 | ~ | 按位取反运算符 | ~表达式 | 右到左 | 单目运算符 |
2 | ++ | 自增运算符 | ++变量名/变量名++ | – | 单目运算符 |
2 | – | 自减运算符 | –变量名/变量名– | – | 单目运算符 |
2 | * | 取值运算符 | *指针变量 | 右到左 | 单目运算符 |
2 | & | 取地址运算符 | &变量名 | 右到左 | 单目运算符 |
2 | ! | 逻辑非运算符 | !表达式 | 右到左 | 单目运算符 |
2 | (类型) | 强制类型转换 | (数据类型)表达式 | – | – |
2 | sizeof | 长度运算符 | sizeof(表达式) | – | – |
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
3 | * | 乘 | 表达式*表达式 | 左到右 | 双目运算符 |
3 | % | 余数(取模) | 整型表达式%整型表达式 | 左到右 | 双目运算符 |
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
4 | - | 减 | 表达式-表达式 | 左到右 | 双目运算符 |
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
5 | >> | 右移 | 变量>>表达式 | 左到右 | 双目运算符 |
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
6 | >= | 大于等于 | 表达式>=表达式 | 左到右 | 双目运算符 |
6 | < | 小于 | 表达式<表达式 | 左到右 | 双目运算符 |
6 | <= | 小于等于 | 表达式<=表达式 | 左到右 | 双目运算符 |
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
7 | != | 不等于 | 表达式!= 表达式 | 左到右 | 双目运算符 |
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = |
赋值运算符 | 变量=表达式 | 右到左 | – |
14 | /= |
除后赋值 | 变量/=表达式 | 右到左 | – |
14 | *= |
乘后赋值 | 变量*=表达式 | 右到左 | – |
14 | %= |
取模后赋值 | 变量%=表达式 | 右到左 | – |
14 | += |
加后赋值 | 变量+=表达式 | 右到左 | – |
14 | -= |
减后赋值 | 变量-=表达式 | 右到左 | – |
14 | <<= |
左移后赋值 | 变量<<=表达式 | 右到左 | – |
14 | >>= |
右移后赋值 | 变量>>=表达式 | 右到左 | – |
14 | &= |
按位与后赋值 | 变量&=表达式 | 右到左 | – |
14 | ^= |
按位异或后赋值 | 变量^=表达式 | 右到左 | – |
14 | ` | =` | 按位或后赋值 | 变量 | =表达式 |
15 | , |
逗号运算符 | 表达式,表达式,… | 左到右 | – |
到了这里,关于C语言控制语句——运算符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!