切换与增量之间的差异并评估

时间:2018-06-01 07:06:41

标签: c while-loop switch-statement post-increment

如果i等于1,则在此声明之后

while (i++ <= 10){} 

i被视为2,即在块中的评估之前递增。

但如果在开关中使用,

switch(i++){} 

i在块中递增之前得到评估。

为什么这些案例i++表现不同?

示例:

For While case:

#include <stdio.h>

int main()
{
    int age = 20;

    while (age++ <= 65)
    {
        if ((age % 20) == 0)
        {
            printf("You are %d years old\n", age);
        }       
    }

    return 0;
}

我希望打印出来:

You are 20 years old
You are 40 years old
You are 60 years old

对于开关案例:

#include <stdio.h>

int main()
{
 int i = 0;

 while (i < 3)
 {
     switch (i++)
     {
         case 0:printf("print 0");
         case 1:printf("print 1");
         case 2:printf("print 2");
         default:printf("Oh no!");
     }
     putchar('\n');
 }

 return 0;
}

4 个答案:

答案 0 :(得分:3)

有了这个

while (i++ <= 10){} 

发生以下情况:

  • 我从1开始
  • i(成为一个)与10
  • 进行比较
  • 我增加到2
  • 块被执行,i为2

有趣的是,如果我从10开始,则while循环再次执行,我是11。

有了这个:

switch(i++){}
  • 我从1开始
  • 根据&#34; 1&#34;
  • 选择要执行的case
  • 我增加到2
  • &#34; 1&#34;被执行,我是&#34; 2&#34;

答案 1 :(得分:2)

实际上,在两种情况下都会发生同样的情况:原始值用于比较,它会递增并执行块。请查看以下代码:

#include <stdio.h>

int main() {
    int i=1;

    switch(i++) {
    case 1:
        printf("Case 1: %d\n", i);
        break;
    default:
        printf("Not 1: %d\n", i);
    }
    return 0;
}

它的输出是:

Case 1: 2

证明在评估块之前i已递增

答案 2 :(得分:1)

不,情况并非如此。

在这两种情况下,值的增量,后增量运算符的副作用都发生在结果的值计算之后。

引用C11,章节§6.5.2.4,(强调我的

  

postfix ++运算符的结果是操作数的值。作为副作用,   操作数对象的值递增(即,相应类型的值为1   添加到它)。[...] 结果的值计算在副作用之前排序   更新操作数的存储值。 [...]

详细说明

  • 如果是while (i++ <= 10),则在递增之前i的值用于验证循环条件。

  • switch(i++){}的情况下,i的值在递增之前用于跳转到特定情况。未修改的(尚)值用作控制表达式的值,在评估控制表达式后,将发生增量。

要添加,如果您尝试在其中一个案例陈述(例如i)中打印case 1:的值,则可以看到它实际上已增加。

答案 3 :(得分:0)

while循环不会打印You are 20 years old,因为变量在执行循环体之前会递增。它最初是age = 20。第一个

while (age++ <= 65)

测试是否20 <= 65,因此它进入循环。然后它递增age,因此在循环内它age = 21。因此,测试if (age % 20 == 0)将无法成功,您也不会收到You are 20 years old的消息。

在循环的未来迭代期间仍会打印20的其他倍数。