我有以下代码:
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,因为它是一个后增量运算符,因此将执行情况1中的语句,这意味着j
被计算为2.然后没有休息时,程序继续执行以下所有语句。由于i
的值不会更改,因此j
的值也不会更改。所以我希望输出类似2 2
,但结果是2 6
。请有人给我一个解释,谢谢!
答案 0 :(得分:5)
由于i的值没有改变,因此j的值也不会改变。
不正确。
j += i
与j = j + i
相同,i is 2
与<{>} switch(..)
声明一样。
执行 3次会为您提供6
。
答案 1 :(得分:2)
关键是在处理case语句之前评估“switch(i ++)”。因此,i ++将i设置为2.但是,由于i ++是后增量,因此它将评估为1。因此,将触发第一种情况。由于没有中断语句,代码将落在所有三个中,导致j == 6.
答案 2 :(得分:1)
j将在开关块中递增三次。我将首先转到案例1,因为我的帖子是递增的。由于没有中断语句,它将通过所有案例陈述,从而给出值6
答案 3 :(得分:1)
必须在每个case语句中添加break语句以防止通过行为。
你认为代码工作的方式如下:
1.开关评估i = 1
2.将i增加到2.
3.输入开关并执行案例1.
4.退出开关。
实际发生的方式:
1.开关评估i = 1
2.将i增加到2.
3.输入switch语句并执行案例1.
4.落实并执行案例2.
5.落实并执行案例3.
6.退出开关语句。
对于您想要的行为,请尝试:
开关(I ++)
{
案例1:j + = i;
打破;
......对案例2和案例3执行相同的操作
}
答案 4 :(得分:0)
如果你做了j = i而不是j + = i,那么你所期待的答案就会到来。但是你使用的是j + = i,它转换为j = j + i;这意味着j在每一步都会得到更新。