switch语句和增量

时间:2013-02-23 09:32:50

标签: c

我有以下代码:

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

5 个答案:

答案 0 :(得分:5)

  

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

不正确。

j += ij = 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在每一步都会得到更新。