3

我有以下代码:

int i = 1;
int j = 0;
switch (i++)
{
case 1: j += i;
case 2: j += i;
case 3: j += i;
break;
}
printf("%d %d",i, j);

i++表达式的计算结果i为 1,因为它是一个后自增运算符,因此将执行 case 1 中的语句,这意味着j计算结果为 2。然后,程序继续执行以下所有语句。由于 的值i不变,所以 的值也j不变。所以我希望输出是这样的,2 2但结果是2 6。谁能给我一个解释,谢谢!

4

5 回答 5

5

由于 i 的值不会改变,因此 j 的值也不会改变。

不对。

j += i与 , 相同j = j + i,并且i is 2一次switch(..)语句中。

这执行了3 次给你6

于 2013-02-23T09:35:07.250 回答
2

关键是在处理案例语句之前评估“switch(i++)”。因此 i++ 会将 i 设置为 2。但是,由于 i++ 是后增量,因此它将计算为 1。因此将触发第一种情况。由于没有 break 语句,代码将通过所有三个导致 j==6。

于 2013-02-23T09:38:29.483 回答
1

j 将在 switch 块中增加三次。我将首先转到案例 1,因为 i 是后递增的。由于没有 break 语句,它将遍历所有 case 语句,从而给出值 6

于 2013-02-23T09:46:45.670 回答
1

必须在每个 case 语句中添加一个 break 语句,以防止行为失败。您认为代码工作的方式如下:
1. Switch 评估 i = 1。
2. 将 i 递增到 2。
3. 输入 switch 并执行 case 1。
4. 退出 switch。
实际发生的方式:
1. Switch 评估 i = 1。
2. 将 i 递增到 2。
3. 输入 switch 语句并执行案例 1。
4. 失败并执行案例 2。
5. 失败并执行案例 3。
6 . 退出switch语句。

对于您想要尝试的行为:
switch(i++)
{
case 1: j+=i;
休息;
... 对案例 2 和案例 3 执行相同操作
}

于 2013-02-23T09:52:30.273 回答
0

如果你做了 j = i 而不是 j+= i,你所期望的答案就会出现。但是您使用的是 j+=i ,它转换为 j = j+i; 这意味着 j 在每一步中都会更新。

于 2013-02-23T10:19:22.880 回答