这是我遇到问题的代码类型,只是一个例子:
#include <stdio.h>
#define TEN 10
int main(void)
{
int n = 0;
while (n++ < TEN)
printf("%5d", n);
printf("\n");
return 0;
}
这里,increment运算符首先在while循环内部工作,n得到1;然后它再次使用while循环的printf()语句,这样现在n得到2并且第一次执行printf()语句时打印“1”?因为否则,将打印“0”。我不确定它是否以这种方式工作,所以你能解释一下,就像我说的那样吗? PS:我没有老师,所以我问你们......
答案 0 :(得分:4)
这里的技巧是++
后缀运算符:它被称为后增量。表达式中使用的值,如果n
之前增量和n
的值在下一个序列点之前的某个点更新,或者是表达式的结尾,函数调用或逗号运算符,是您不太可能很快就需要的高级运算符。
另一个警告是C中布尔值的特殊处理:比较如n < 10
如果为真,则评估为1
,否则为0
。相反,没有比较的测试(例如if (n)
对任何非零,非零和非NaN值都成功。
以下是事件序列:
int n = 0
定义并初始化n
类型的局部变量int
为值0
。while (n++ < TEN)
:n
与TEN
进行比较,结果为真(C 1
),因为0 < 10
然后 n
会递增并获得值1
。比较结果为真,因此while
循环进入其命令语句。printf("%5d", n);
打印n
的值,即1
。while (n++ < TEN)
:n
再次与TEN
进行比较,结果仍为1
,因为1 < 10
然后 {{1增加并获得值n
。比较结果为真,因此2
循环进入其命令语句。while
打印printf("%5d", n);
的值,即n
。请注意,此输出与上一输出之间没有分隔符,也不存在下一个输出。2
9
:while (n++ < TEN)
与n
进行比较,结果为TEN
,因为1
然后 9 < 10
递增并获得值n
。比较的结果仍然是正确的,因为比较是在增量之前执行的,因此10
循环进入其命令语句。while
打印printf("%5d", n);
的值,即n
。10
:while (n++ < TEN)
与n
进行比较,结果为假(C TEN
),因为0
&lt; 10 101 is not
n **then**
11 is incremented and gets the value
while循环停止,控件跳到下一个语句。. The result of the comparison is false hence the
打印换行符,结束输出行printf("\n");
12345678910
return 0;
函数返回退出状态为main
,表示成功。答案 1 :(得分:1)
n++
是post
增量。请参阅标准n1570
部分6.5.2.4
postfix ++运算符的结果是操作数的值。如 副作用,操作数对象的值递增(即 是,相应类型的值1被添加到它)。
while (n++ < TEN) /* 0 < 10 not 1 < 10 */
printf("%5d", n);/* here incremented value gets printed */