运算符的用法解析"/>
C语言34种运算符的用法解析
运算符优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | |
() | 圆括号 | (表达式) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | |||
++ | 自增运算符 | ++变量名 | 单目运算符 | ||
-- | 自减运算符 | --变量名 | 单目运算符 | ||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | |||
3 | / | 除 | 表达式 / 表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式%整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | |
/= | 除后赋值 | 变量/=表达式 | |||
*= | 乘后赋值 | 变量*=表达式 | |||
%= | 取模后赋值 | 变量%=表达式 | |||
+= | 加后赋值 | 变量+=表达式 | |||
-= | 减后赋值 | 变量-=表达式 | |||
<<= | 左移后赋值 | 变量<<=表达式 | |||
>>= | 右移后赋值 | 变量>>=表达式 | |||
&= | 按位与后赋值 | 变量&=表达式 | |||
^= | 按位异或后赋值 | 变量^=表达式 | |||
|= | 按位或后赋值 | 变量|=表达式 | |||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 |
C 算术运算符
操作员 | 运算符的含义 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 分配 |
% | 除法后的余数(模除) |
// 算数运算符的使用
#include <stdio.h>
int main()
{int a = 9,b = 4, 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的余数为 b= %d \n",c);return 0;
}
C 自增和自减运算符
C 编程有两个运算符递增++
和递减,--
用于将操作数(常量或变量)的值更改 1。
增量++
将值增加 1,而减量--
将值减少 1。这两个运算符是一元运算符,这意味着它们仅对单个操作数进行操作。
// 自增自减运算符的使用
#include <stdio.h>
int main()
{int a = 10, b = 100;float c = 10.5, d = 100.5;printf("++a = %d \n", ++a);printf("--b = %d \n", --b);printf("++c = %f \n", ++c);printf("--d = %f \n", --d);return 0;
}
C 赋值运算符
运算符 | 举例 | 相等 |
---|---|---|
= | a = b | a = b |
+= | a += b | a = a+b |
-= | a -= b | a = a-b |
*= | a *= b | a = a*b |
/= | a /= b | a = a/b |
%= | a %= b | a = a%b |
//赋值运算符的使用
#include <stdio.h>
int main()
{int a = 5, c;c = a; // c 为 5printf("c = %d\n", c);c += a; // c 为 10 printf("c = %d\n", c);c -= a; // c 为 5printf("c = %d\n", c);c *= a; // c 为 25printf("c = %d\n", c);c /= a; // 为 is 5printf("c = %d\n", c);c %= a; // c = 0printf("c = %d\n", c);return 0;
}
C 关系运算符
操作员 | 运算符的含义 | 例子 |
---|---|---|
== | 等于 | 5 == 3 被评估为 0 |
> | 大于 | 5 > 3 被评估为 1 |
< | 少于 | 5 < 3 被评估为 0 |
!= | 不等于 | 5 != 3 被评估为 1 |
>= | 大于或等于 | 5 >= 3 被评估为 1 |
<= | 小于或等于 | 5 <= 3 被评估为 0 |
// 关系运算符的使用
#include <stdio.h>
int main()
{int a = 5, b = 5, c = 10;printf("%d == %d 是 %d \n", a, b, a == b);printf("%d == %d 是 %d \n", a, c, a == c);printf("%d > %d 是 %d \n", a, b, a > b);printf("%d > %d 是 %d \n", a, c, a > c);printf("%d < %d 是 %d \n", a, b, a < b);printf("%d < %d 是 %d \n", a, c, a < c);printf("%d != %d 是 %d \n", a, b, a != b);printf("%d != %d 是 %d \n", a, c, a != c);printf("%d >= %d 是 %d \n", a, b, a >= b);printf("%d >= %d 是 %d \n", a, c, a >= c);printf("%d <= %d 是 %d \n", a, b, a <= b);printf("%d <= %d 是 %d \n", a, c, a <= c);return 0;
}
C 逻辑运算符
包含逻辑运算符的表达式返回 0 或 1,具体取决于表达式结果是 true 还是 false。逻辑运算符常用于判断语句。
操作员 | 意义 | 例子 |
---|---|---|
&& | 逻辑与。仅当所有操作数都为真时才为真 | 如果 c = 5 且 d = 2,则表达式((c==5) && (d>5)) 等于 0。 |
|| | 逻辑或。仅当任一操作数为真时才为真 | 如果 c = 5 且 d = 2,则表达式((c==5) || (d>5)) 等于 1。 |
! | 逻辑非。仅当操作数为 0 时才为 True | 如果 c = 5,则表达式!(c==5) 等于 0。 |
// 逻辑运算符的使用规则#include <stdio.h>
int main()
{int a = 5, b = 5, c = 10, result; //result 用来存放结果result = (a == b) && (c > b);printf("(a == b) && (c > b) is %d \n", result);result = (a == b) && (c < b);printf("(a == b) && (c < b) is %d \n", result);result = (a == b) || (c < b);printf("(a == b) || (c < b) is %d \n", result);result = (a != b) || (c < b);printf("(a != b) || (c < b) is %d \n", result);result = !(a != b);printf("!(a != b) is %d \n", result);result = !(a == b);printf("!(a == b) is %d \n", result);return 0;
}
输出
(a == b) && (c > b) 为 1
(a == b) && (c < b) 为 0
(a == b) || (c < b) 是 1
(a != b) || (c < b) 为 0
!(a != b) 为 1
!(a == b) 为 0
(a == b) && (c > 5)
计算结果为 1,因为两个操作数(a == b)
和(c > b)
都是 1(真)。(a == b) && (c < b)
计算结果为 0,因为操作数(c < b)
为 0(假)。(a == b) || (c < b)
计算结果为 1,因为(a = b)
为 1(真)。(a != b) || (c < b)
计算结果为 0,因为操作数(a != b)
和(c < b)
均为 0(假)。!(a != b)
计算结果为 1,因为操作数(a != b)
为 0(假)。因此,!(a != b) 为 1(真)。!(a == b)
计算结果为 0,因为(a == b)
为 1(真)。因此,!(a == b)
为 0(假)。
C 位运算符
在计算过程中,加法、减法、乘法、除法等数学运算被转换为位级,这使得处理速度更快并节省功耗。
位运算符在 C 编程中用于执行位级运算。
运营商 | 运算符的含义 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位求补 |
<< | 左移 |
>> | 右移 |
按位与运算符 &
如果两个操作数的相应位为1,则按位 AND 的输出为1。如果操作数的任一位为0,则相应位的结果将计算为0。
在 C 编程中,按位 AND 运算符用 表示&
。
让我们假设两个整数12和25的按位 AND 运算。
12 = 00001100(二进制) 25 = 00011001(二进制)12和25的位运算00001100 & 00011001________00001000 = 8(十进制)
事例按位与
#include <stdio.h>int main() {int a = 12, b = 25;printf("Output = %d", a & b);return 0;
}
结果
输出=8
按位或运算符 |
如果两个操作数的至少一个对应位为1,则按位 OR 的输出为1。在 C 编程中,按位 OR 运算符用 表示|
。
12 = 00001100(二进制) 25 = 00011001(二进制)12 和 25 的按位或运算00001100 | 00011001________00011101 = 29(十进制)
#include <stdio.h>int main() {int a = 12, b = 25;printf("Output = %d", a | b);return 0;
}
结果
输出 = 29
按位 XOR(异或)运算符 ^
如果两个操作数的相应位相反,则按位异或运算符的结果为1 。它用 表示^
。
12 = 00001100(二进制) 25 = 00011001(二进制)12 和 25 的按位异或运算00001100 ^00011001________00010101 = 21(十进制)
#include <stdio.h>int main() {int a = 12, b = 25;printf("Output = %d", a ^ b);return 0;
}
结果
输出 = 21
按位补码运算符 ~
按位求补运算符是一种一元运算符(仅适用于一个操作数)。它将1更改为0,将0更改为1。它用 表示~
。
35 = 00100011(二进制)35 的按位求补运算 ~ 00100011________11011100 = 220(十进制)
C 编程中按位补码运算符的扭转
35 ( )的按位补码~35
是-36而不是220,但为什么呢?
对于任意整数n, 按位求补n将会-(n + 1)
。要理解这一点,您应该了解 2 的补码。
2的补码
二进制补码是对二进制数的运算。一个数的 2 补码等于该数的补码加 1。例如:
十进制 二进制 2 的补码0 00000000 -(11111111+1) = -00000000 = -0(十进制)1 00000001 -(11111110+1) = -11111111 = -256(十进制)12 00001100 -(11110011+1) = -11110100 = -244(十进制)220 11011100 -(00100011+1) = -00100100 = -36(十进制)注意:计算 2 的补码时,溢出被忽略。
35的按位补码是220(十进制)。220的 2 的补码是-36。因此,输出是-36而不是220。
任何数字 N 的按位补码是 -(N+1)。就是这样:
N 的按位补码 = ~N(以 2 的补码形式表示) ~N 的 2' 补码= -(~(~N)+1) = -(N+1)
按位补码
#include <stdio.h>int main() {printf("Output = %d\n", ~35);printf("Output = %d\n", ~-12);return 0;
}
输出
输出=-36
输出 = 11
C 编程中的移位运算符
C 语言编程中有两种移位运算符:
- 右移运算符
- 左移运算符。
右移运算符
右移运算符将所有位向右移动一定数量的指定位。它用 表示>>
。
212 = 11010100(二进制) 212 >> 2 = 00110101 (二进制) [右移两位] 212 >> 7 = 00000001(二进制) 212 >> 8 = 00000000 212 >> 0 = 11010100(无移位)
左移运算符
左移运算符将所有位向左移动一定数量的指定位。左移运算符空出的位用0填充。左移运算符的符号是<<
。
212 = 11010100(二进制) 212<<1 = 110101000 (二进制) [左移一位] 212<<0 = 11010100(移 0) 212<<4 = 110101000000(二进制)=3392(十进制)
移位运算符
#include <stdio.h>int main() {int num=212, i;for (i = 0; i <= 2; ++i) {printf("Right shift by %d: %d\n", i, num >> i);}printf("\n");for (i = 0; i <= 2; ++i) {printf("Left shift by %d: %d\n", i, num << i); }return 0;
}
结果
右移 0:212
右移 1: 106
右移 2: 53左移 0:212
左移 1:424
左移 2:848
逗号运算符
逗号运算符用于将相关表达式链接在一起。例如:
int a, c = 5, d;
运算符的大小
是sizeof
一个一元运算符,返回数据的大小(常量、变量、数组、结构体等)。
#include <stdio.h>
int main()
{int a;float b;double c;char d;printf("Size of int=%lu bytes\n",sizeof(a));printf("Size of float=%lu bytes\n",sizeof(b));printf("Size of double=%lu bytes\n",sizeof(c));printf("Size of char=%lu byte\n",sizeof(d));return 0;
}
结果
int 的大小 = 4 字节 浮点数的大小 = 4 字节 双精度数的大小 = 8 字节 字符大小 = 1 字节
更多推荐
C语言34种运算符的用法解析
发布评论