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 为 5
printf("c = %d\n", c);
c += a; // c 为 10
printf("c = %d\n", c);
c -= a; // c 为 5
printf("c = %d\n", c);
c *= a; // c 为 25
printf("c = %d\n", c);
c /= a; // 为 is 5
printf("c = %d\n", c);
c %= a; // c = 0
printf("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 编程中的决策。
操作员 | 意义 | 例子 |
---|---|---|
&& | 逻辑与。仅当所有操作数都为真时才为真 | 如果 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 字节