企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#### 7. 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符: * 算术运算符 * 关系运算符 * 逻辑运算符 * 位运算符 * 赋值运算符 * 杂项运算符 **算术运算符** 下表显示了 C 语言支持的所有算术运算符。假设变量 **A** 的值为 10,变量 **B** 的值为 20,则: | 运算符 | 描述 | 实例 | | --- | --- | --- | | + | 把两个操作数相加 | A + B 将得到 30 | | \- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 | | \* | 把两个操作数相乘 | A \* B 将得到 200 | | / | 分子除以分母 | B / A 将得到 2 | | % | 取模运算符,整除后的余数 | B % A 将得到 0 | | ++ | 自增运算符,整数值增加 1 | A++ 将得到 11 | | \-- | 自减运算符,整数值减少 1 | A-- 将得到 9 | 例子: ~~~ void main(){ int a = 21; int b = 10; 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); c = ++a; printf("++a = %d , %d \n", c, a); c = b++; printf("b++ = %d , %d \n", c, b); c = b--; printf("b-- = %d \n", c); } ~~~ 输出: ~~~ a + b = 31 a - b = 11 a * b = 210 a / b = 2 a b = 1 ++a = 22 , 22 b++ = 10 , 11 b-- = 11 ~~~ **关系运算符** 下表显示了 C 语言支持的所有关系运算符。假设变量 **A** 的值为 10,变量 **B** 的值为 20,则: | 运算符 | 描述 | 实例 | | --- | --- | --- | | \== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 为假。 | | != | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 | | \> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 为假。 | | < | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 | | \>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 为假。 | | <= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 | **逻辑运算符** 下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 **A** 的值为 1,变量 **B** 的值为 0,则: ![](https://img.kancloud.cn/c8/36/c836bb98e99c791f308e06b6f1843204_656x258.png) ~~~ void main(){ int a1 = 5; int b1 = 5; int c1; //如果两个操作数都非零,则条件为真。 if (a1 && b1) { printf("a1 && b1 %d \n", true); } else { printf("a1 && b1 %d \n", false); } //如果两个操作数中有任意一个非零,则条件为真。 if (a1 || b1) { printf("a1 || b1 %d \n", true); } else { printf("a1 || b1 %d \n", false); } //改变 a1 b1 的值 a1 = 0; b1 = 10; //如果两个操作数都非零,则条件为真。 if (a1 && b1) { printf("a1 && b1 %d \n", true); } else { printf("a1 && b1 %d \n", false); } if (!(a1 && b1)) { printf("!(a1 && b1) %d \n", true); } else { printf("a1 || b1 %d \n", false); } } ~~~ 输出: ~~~ a1 && b1 1 a1 || b1 1 a1 && b1 0 !(a1 && b1) 1 ~~~ **位运算符** ![](https://img.kancloud.cn/3f/14/3f14739c6dab3abd2861fdd4d6ed8665_653x255.png) ~~~ void main(){ //位运算符 & | ^ ~ int wA = 60; //0011 1100 int wB = 13; //0000 1101 int wC = 10; //都为真,才是真 0000 1100 printf("wA & wB=?%d\n", wA & wB); //其中一个为真,就为真 0011 1101 printf("wA | wB=?%d\n", wA | wB); //一个为真则为真,2个为真这为假 00110001 printf("wA ^ wB=?%d\n", wA ^ wB); printf("~wB=?%d\n", ~wB); //二进制左移运算符 左 * 4 = 40 printf("wC<<2=?%d\n", wC << 2); //二进制右移运算符 右 / 4 printf("wC>>2=?%d\n", wC >> 2); } ~~~ 输出 ~~~ wA & wB=?12 wA | wB=?61 wA ^ wB=?49 ~wB=?-14 wC<<2=?40 wC>>2=?2 ~~~ 下表显示了 C 语言支持的位运算符。假设变量 **A** 的值为 60,变量 **B** 的值为 13,则: | 运算符 | 描述 | 实例 | | --- | --- | --- | | & | 按位与操作,按二进制位进行"与"运算。运算规则:`0&0=0; 0&1=0; 1&0=0; 1&1=1;` | (A & B) 将得到 12,即为 0000 1100 | | | | 按位或运算符,按二进制位进行"或"运算。运算规则:`0|0=0; 0|1=1; 1|0=1; 1|1=1;` | (A | B) 将得到 61,即为 0011 1101 | | ^ | 异或运算符,按二进制位进行"异或"运算。运算规则:`0^0=0; 0^1=1; 1^0=1; 1^1=0;` | (A ^ B) 将得到 49,即为 0011 0001 | | ~ | 取反运算符,按二进制位进行"取反"运算。运算规则:`~1=0; ~0=1;` | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 | | << | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 | A << 2 将得到 240,即为 1111 0000 | | \>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 | A >> 2 将得到 15,即为 0000 1111 | **赋值运算符** 下表列出了 C 语言支持的赋值运算符: | 运算符 | 描述 | 实例 | | --- | --- | --- | | \= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C | | += | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A | | \-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A | | \*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C \*= A 相当于 C = C \* A | | /= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A | | %= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A | | <<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 | | \>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 | | &= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 | | ^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 | | |= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 | 例子: ~~~ void main(){ int wAA = 21; int wBB; wBB = wAA; printf("= %d\n", wBB); wBB += wAA; printf("+= %d\n", wBB); wBB -= wAA; printf("-= %d\n", wBB); wBB *= wAA; printf("*= %d\n", wBB); wBB /= wAA; printf("/= %d\n", wBB); wBB %= wAA; printf("%= %d\n", wBB); wBB <<= wAA; printf("<<= %d\n", wBB); wBB <<= wAA; printf(">>= %d\n", wBB); wBB &= wAA; printf("&= %d\n", wBB); wBB ^= wAA; printf("^= %d\n", wBB); wBB |= wAA; printf("|= %d\n", wBB); } ~~~ 输出: ~~~ = 21 += 42 -= 21 *= 441 /= 21 = 0 <<= 0 >>= 0 &= 0 ^= 21 |= 21 ~~~ **杂项运算符 sizeof、&、三元** 下表列出了 C 语言支持的其他一些重要的运算符,包括 **sizeof** 和 **? :**。 | 运算符 | 描述 | 实例 | | --- | --- | --- | | sizeof() | 返回变量的大小。 | sizeof(a) 将返回 4,其中 a 是整数。 | | & | 返回变量的地址。 | &a; 将给出变量的实际地址。 | | \* | 指向一个变量。 | \*a; 将指向一个变量。 | | ? : | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y | 例子: ~~~ void main(){ int zxA = 4; short zxB; double zxC; int *ptr; //sizeOf 运算符实例 ,lu 32位无符号整数 printf("zxA sizeOf = %lu \n", sizeof(zxA)); printf("zxB sizeOf = %lu \n", sizeof(zxB)); printf("zxC sizeOf = %lu \n", sizeof(zxC)); //& 和 * 运算符实例 ptr = &zxA; //将 zxA 的地址值复制给 ptr 指针 printf("zxA 的值为:%d \n", zxA); printf("*ptr 的值为:%d \n", *ptr); //三元运算符 zxA = 10; zxB = (zxA == 1) ? 20 : 30; printf("zxb 的值为:%d \n", zxB); zxB = (zxA == 10) ? 20 : 30; printf("zxb 的值为:%d \n", zxB); } ~~~ 输出: ~~~ zxA sizeOf = 4 zxB sizeOf = 2 zxC sizeOf = 8 zxA 的值为:4 *ptr 的值为:4 zxb 的值为:30 zxb 的值为:20 ~~~