Switch语句和递增运算符

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。请问有人能给我一个解释吗?谢谢!

"
5个回答

5

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

这是不正确的。

j += ij = j + i相同,并且在switch(..)语句内部i为2

这样执行3次将得到6


请原谅我的无知,我曾认为 j+=i 相当于 j=i+1。因此,用于触发 case 1 的是 i 的原始值(1),之后在处理 case 1 语句之前将其设置为递增的值(2),我是对的吗? - drawar

2
重点是 "switch(i++)" 在处理 case 语句之前被评估。因此 i++ 将把 i 设置为2。然而,它将评估为1,因为 i++ 是一个后缀递增。因此,第一个 case 将被触发。由于没有 break 语句,代码将跨越这三个 case,导致 j == 6。

如果i的值为1,那么最终如何使j等于6? - DarkFranX
如果i的值为1,那么最后j怎么可能等于6呢? - undefined

1

在switch块中,j将增加三次。因为i是后增量,所以它首先会进入case 1。由于没有break语句,它将通过所有的case语句,从而得到值6。


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语句并执行case 1。
4. 穿透并执行case 2。
5. 穿透并执行case 3。
6. 退出switch语句。

要获得所需的行为,请尝试:
switch(i++)
{
case 1: j+=i;
break;
... 对于case 2和case 3做同样的事情
}


0
如果你使用了 j+=i 而不是 j=i,那么你期望的答案就会出现。但是 j+=i 的意思是 j=j+i;这意味着 j 在每一步都被更新了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接