如果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;
}
答案 0 :(得分:3)
有了这个
while (i++ <= 10){}
发生以下情况:
有趣的是,如果我从10开始,则while循环再次执行,我是11。
有了这个:
switch(i++){}
case
答案 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的其他倍数。