C语言运算符进阶练习精选

每个知识点2个高质量题目 - 深度理解运算符原理
8

关系运算符进阶练习

高难度

优先级与类型转换

分析以下程序的输出结果,考虑关系运算符优先级和类型转换:

#include<stdio.h> int main() { int x = 10, y = 3; float a = 15.5, b = 2.0; int result1 = (x / y == a / b); float result2 = (x % y) * (a / b); printf("result1: %d\n", result1); printf("result2: %.2f", result2); return 0; }
运行结果:
result1: 0
result2: 7.75
解析:
- result1: x/y = 10/3 = 3 (整数除法)
            a/b = 15.5/2.0 = 7.75
            3 == 7.75 → 0 (假)
- result2: x%y = 10%3 = 1
            a/b = 7.75
            1 * 7.75 = 7.75
高难度

复合条件与短路求值

分析以下程序的输出结果,注意关系运算符和逻辑运算符的优先级:

#include<stdio.h> int main() { int a = 5, b = 10, c = 15; int result = a < b < c; printf("result1: %d\n", result); int d = 20, e = 25; int result2 = (d > e) == (a < b); printf("result2: %d", result2); return 0; }
运行结果:
result1: 1
result2: 0
解析:
- result1: 表达式 a < b < c 等价于 (a < b) < c
            (5<10)=1 → 1<15=1 (真)
- result2: (d > e) → 20>25=0 (假)
            (a < b) → 5<10=1 (真)
            0 == 1 → 0 (假)
9

逻辑运算符进阶练习

高难度

嵌套逻辑与短路求值

分析以下程序,考虑短路求值和运算符优先级:

#include<stdio.h> int main() { int a = 0, b = 5, c = 10; int result = !a || (b++ && c--) && (a = 5); printf("result: %d\n", result); printf("a: %d, b: %d, c: %d", a, b, c); return 0; }
运行结果:
result: 1
a: 0, b: 5, c: 10
解析:
- !a → !0 → 1 (真),由于是逻辑或,整个表达式结果已确定为真
- 发生短路求值,后面表达式(b++ && c--) && (a = 5) 不被执行
- 因此a、b、c的值保持不变
高难度

复合逻辑与位运算混合

以下程序涉及逻辑运算和位运算的混合使用:

#include<stdio.h> int main() { int x = 5, y = 10, z = 15; int res1 = (x < y) && (y < z) || (z < x) && !(x == 5); printf("res1: %d\n", res1); int res2 = (x * 2 == y) || (y + 5 > z) && (z % x != 0); printf("res2: %d\n", res2); int a = 7, b = 12; int res3 = (a & b) && (a | b); printf("res3: %d", res3); return 0; }
运行结果:
res1: 1
res2: 1
res3: 1
解析:
- res1: (5<10) && (10<15) → 1 && 1 → 1
         发生短路,后面部分不计算
- res2: (5 * 2==10) → 1,短路求值,后面不计算
- res3: a & b = 7(0111) & 12(1100) = 0100(4) → 真
         a | b = 15 → 真
         4 && 15 → 1
10

赋值运算符进阶练习

高难度

复合赋值与自增

分析以下程序中的复合赋值和自增运算符:

#include<stdio.h> int main() { int x = 10, y = 20, z = 30; z += x -= y *= 2; printf("x: %d\n", x); printf("y: %d\n", y); printf("z: %d\n", z); int a = 5, b = 5; b += a *= b += 3; printf("a: %d, b: %d", a, b); return 0; }
运行结果:
x: -30
y: 40
z: 0
a: 40, b: 48
解析:
- 第一组:赋值从右向左结合
         y *= 2 → y = 40
         x -= y → x = 10 - 40 = -30
         z += x → z = 30 + (-30) = 0
- 第二组:
         b += 3 → b = 8
         a *= b → a = 5 * 8 = 40
         b += a → b = 8 + 40 = 48
高难度

多重赋值与类型转换

以下程序涉及多重赋值和自动类型转换:

#include<stdio.h> int main() { int a, b, c; float x, y, z; a = b = c = 10.7; x = y = z = 15; printf("a=%d, b=%d, c=%d\n", a, b, c); printf("x=%.1f, y=%.1f, z=%.1f\n", x, y, z); char ch1, ch2; int i1, i2; ch1 = i1 = 300; i2 = ch2 = 300; printf("ch1=%d, i1=%d\n", ch1, i1); printf("ch2=%d, i2=%d", ch2, i2); return 0; }
运行结果:
a=10, b=10, c=10
x=15.0, y=15.0, z=15.0
ch1=44, i1=300
ch2=44, i2=44
解析:
- 整数赋值浮点数会被截断
- 浮点数赋值整数会取整
- char类型范围(-128~127),300溢出:300-256=44
11

逗号运算符进阶练习

高难度

逗号运算符在循环中

分析以下程序,理解逗号运算符在for循环中的使用:

#include<stdio.h> int main() { int i, j; // 逗号运算符用于控制多个变量 for(i = 0, j = 10; i < j; i++, j -= 2) { printf("i=%d, j=%d\n", i, j); } // 输出最终结果 printf("Final values: i=%d, j=%d", i, j); return 0; }
运行结果:
i=0, j=10
i=1, j=8
i=2, j=6
i=3, j=4
Final values: i=4, j=2
解析:
- for循环使用逗号运算符初始化两个变量
- 每次迭代更新两个变量:i增加1,j减少2
- 当i=4时,j=2,此时i<j不成立(4<2为假),循环结束
高难度

逗号运算符与函数返回值

以下程序涉及逗号运算符和函数返回值的结合使用:

#include<stdio.h> int calculate(int a, int b) { return (a + b, a * b, a - b); } int main() { int result1 = calculate(10, 5); int result2 = (printf("Step12 "), printf("Step234 "), 100); printf("\nresult1: %d\n", result1); printf("result2: %d", result2); return 0; }
运行结果:
Step1 Step2
result1: 5
result2: 100
变题:
- int result2 = (printf("Step12 "), printf("Step234 "));
- 此时答案为?