【问题标题】:Increment and decrement in while loopswhile循环中的递增和递减
【发布时间】:2018-10-08 11:52:39
【问题描述】:

这是我遇到问题的代码类型,只是一个示例:

 #include <stdio.h>
 #define TEN 10
 int main(void)
 {
     int n = 0;
     while (n++ < TEN)
         printf("%5d", n);
     printf("\n");
     return 0;
 }

这里,自增运算符首先在while循环中工作,n取1;然后它再次为 while 循环工作 printf() 语句,所以现在 n 得到 2 并且第一次执行 printf() 语句时打印“1”?因为否则,将打印“0”。我不确定它是否确实以这种方式工作,所以请您解释一下,就像我说的那样吗? PS:我没有老师,所以我问你们......

【问题讨论】:

  • n 在比较之后增加,但在之前打印。顺便说一句,你可以在这里得到一个“老师”:coursera.org/specializations/c-programming
  • 尝试找一本好书,它应该能准确解释前缀和后缀--++运算符的工作原理。
  • #define TEN 10 很傻; #define MAX 10 或类似的东西会更明智。

标签: c while-loop increment


【解决方案1】:

n++ 是一个 post 增量。见标准n1570部分6.5.2.4

后缀 ++ 运算符的结果是操作数的值。作为 副作用,操作数对象的值增加(即 即,将相应类型的值 1 添加到其中)。

while (n++ < TEN) /* 0 < 10 not 1 < 10 */ 
    printf("%5d", n);/* here incremented value gets printed */

【讨论】:

    【解决方案2】:

    这里的技巧是++ 后缀运算符:它被称为后增量。如果 n before 增量和 n 的值在下一个序列点之前的某个点更新,则表达式中使用的值,无论是表达式的结尾、函数调用还是逗号运算符,您不太可能很快需要的高级运算符。

    另一个警告是 C 中布尔值的特殊处理:比较如 n &lt; 10 如果它们为真,则计算为 1,否则计算为 0。相反,没有比较的测试(例如 if (n) 对于任何非零、非空和非 NaN 值都会成功。

    这是事件的顺序:

    • int n = 0 定义一个 int 类型的局部变量 n 并将其初始化为值 0
    • while (n++ &lt; TEN)nTEN 比较,结果为真(C 中的 1),因为 0 &lt; 10 then n 递增并获得值 1。比较结果为真,因此while 循环继续执行其命令语句。
    • printf("%5d", n); 打印出n 的值,即1
    • 执行进入循环测试。
    • while (n++ &lt; TEN)n 再次与 TEN 比较,结果仍然是 1,因为 1 &lt; 10 then n 递增并获得值 2。比较结果为真,因此while 循环继续执行其命令语句。
    • printf("%5d", n); 打印n 的值,即2。请注意,此输出与上一个输出或下一个输出之间没有分隔符。
    • 执行进入循环测试。
    • ...重复这些步骤,直到打印出9
    • while (n++ &lt; TEN)nTEN 比较,结果为 1,因为 9 &lt; 10 then n 递增并获得值 10。比较的结果仍然正确,因为比较是在递增之前执行的,因此while 循环继续执行其命令语句。
    • printf("%5d", n); 打印出n 的值,即10
    • 执行进入循环测试。
    • while (n++ &lt; TEN)nTEN 比较,结果为假(C 中的 0),因为 101 is not**then**nis incremented and gets the value11. The result of the comparison is false hence thewhile` 循环停止并控制跳转到下一条语句。
    • printf("\n"); 打印一个换行符,结束输出行 12345678910
    • return 0;main 函数返回退出状态为0,表示成功。

    【讨论】:

    • 您将1 用于true 的值令人困惑。这个解释中的 1 太多了。记住你的听众
    • True 在 C 中非零且非 1。
    • @RichardChambers:更准确地说,真正的比较在 C 中评估为 1,而使用 ! 的布尔测试对于非零、非空和非 NaN 值是正确的。我的措辞可能有点混乱,但在语义上是正确的。我添加了一段来解释这种 C 主义。
    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多