期中考错题汇总


❌ 错题记录:C 语言八进制陷阱

题目:

1
2
3
4
4、【单选题】下列程序段输出结果为:( )

int x = 1, y = 012;
printf("%d", y * x++);

你的答案:

B. 12(错误)

正确答案:

C. 10


✅ 解析:

关键点:012 是八进制数

  • C 语言中,以 0 开头的整数是八进制(base 8)
  • 012 = 八进制 12 = 十进制 1*8 + 2 = 10

所以:

1
y = 10

表达式:y \* x++

  • x++ 是后置自增:先使用,再自增
  • 表达式中使用的是 x = 1
  • 用完之后 x → 2(但与输出无关)

因此:

1
y * x++ = 10 * 1 = 10

🎯 最终输出:

1
10

🔹 题目 10:赋值表达式右结合陷阱

题目

执行以下语句后,a 的值为多少?

1
2
a = 5;
a += a = 5;

选项:

  • A. 15
  • B. 10
  • C. 20
  • D. 5

我的答案

D. 5(错误)

正确答案

B. 10


✅ 解析

表达式:

1
a += a = 5;

关键点:

① 赋值运算符 = 的结果值是右侧的值

所以:

1
(a = 5) 的结果值是 5

② 赋值表达式从右向左结合

所以执行顺序是:

1
2
a = 5;          // 第一次赋值
a += (a = 5); // 先执行右侧 a = 5,再将值 5 加到前面的 a 上

③ 执行过程逐步展开:

  1. 执行 a = 5

    1
    a = 5
  2. 计算右边 (a = 5)

    1
    2
    a = 5
    表达式值为 5
  3. 执行 a += 5
    等价于:

    1
    a = a + 5 = 5 + 5 = 10

🎯 最终结果

1
a = 10

🔹 题目 16:if 语句作用域被逗号误读

题目

1
2
3
4
5
6
7
8
9
10
11
12
int i, x, y;
i = x = y = 0;

do {
++i;
if (i % 2)
x += i,
i++;
y += i++;
} while (i <= 7);

printf("%d %d %d", i, x, y);

我的答案

9 8 15(错误)

正确答案

9 1 20

错误原因(关键点)

  • x += i, 这一行末尾没有分号
  • 下面的 i++ 实际上是和上面一起属于 if 语句块

也就是说:

1
2
3
4
if (i % 2) {
x += i;
i++; // 这个 i++ 也在 if 里面
}

你原本把它误解成:

1
2
3
if (i % 2)
x += i;
i++; // 实际上不是这样的

因此 if 每次只在奇数 i 才会执行两句,而你之前把第二句当成 if 外的逻辑,导致结果计算错误。