【问题标题】:Strange output when using do/while in C programming lang在 C 编程语言中使用 do/while 时的奇怪输出
【发布时间】:2021-03-12 13:00:33
【问题描述】:

我试图了解这个程序的输出。 如果我尝试“翻译”代码,我相信它应该是这样的:

  • 当“j”小于 3 - 打印“Ha”(此循环执行 3 次,因此它给出 3 个“Ha”)
  • do/while -> j 等于 j - 2 因此打印“Hi” 而 ++j - 最后程序打印出“Hi” 4 次。

程序如何打印4次,这里的条件是如何工作的?

#include <stdio.h>

int main() {

    int j = 0;
    while(j++ < 3){
        printf( "Ha ");
    }
    do{
        j -= 2;
        printf( "Hi "); 
    }
    while(++j);
    for(j = 1; j <= 3; j++){
        printf( "Ho ");
    }
    printf("\n");
    return 0;
}

输出是:

哈哈哈哈嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨嗨

【问题讨论】:

  • 尝试使用调试器逐条执行代码,同时监控变量及其值。那应该告诉你答案。您还可以使用笔和纸“单步执行”代码,每次更改时将所有变量的所有值写在新行上。

标签: c loops do-while post-increment pre-increment


【解决方案1】:

++j是前缀增量,即值会增加,然后,增加的值将用于条件检查。

为了便于理解,我添加了打印声明:

do{
    j -= 2;
    printf( "Hi "); 
    printf("value of j before the while = %d\n", j);
}
while(++j);

输出是:

Hi value of j before the while = 2
Hi value of j before the while = 1
Hi value of j before the while = 0
Hi value of j before the while = -1

所以,在

  • 第一次迭代,在while (++j)j2++j3
  • 第二次迭代,3-2 = 1++j 为 2。
  • 第三次迭代,2-2 = 0++j 为 1。
  • 第四次迭代,1-2 = -1++j 为 0 - 这使得 while 检查为 false 并且循环结束。

【讨论】:

    【解决方案2】:

    第一个while循环之后

    while(j++ < 3){
        printf( "Ha ");
    }
    

    j 等于 4。

    所以在 do-while 循环的第一次迭代中

    do{
        j -= 2;
        printf( "Hi "); 
    }
    while(++j);
    

    j 等于 2。第一次迭代后 j 等于 3。第二次迭代内 j 等于 1。第二次迭代后 j 等于 2。第三次迭代内 j 等于 0。之后第三次迭代 j 等于 1。在第四次迭代中 j 等于 -1。所以在条件的第四次迭代中

    while(++j);
    

    j 等于 0,控制权被传递到下一个循环。 所以do-while循环执行了4次。

    即后缀自增运算符的值是其操作数自增前的值。而前自增运算符的值就是其操作数自增后的值。

    【讨论】:

      【解决方案3】:

      第一次循环后

      j == 4
      j -= 2 == 2
      Hi
      ++j == 3
      j -= 2 == 1
      Hi
      ++j == 2
      j -= 2 == 0
      Hi 
      ++j == 1
      j -= 2 == -1
      Hi
      ++j == 0 //end of th loop
      

      【讨论】:

        【解决方案4】:

        了解你的程序做什么的最好方法是在程序的每一步观察 j 的值。

        第一个 j=0 然后你进入while。

          1. j=0 ; j
          1. j=1 ; j
          1. j=2 ; j
          1. j=3 ; j

        j=4

        然后你离开 while 进入 de do, while() 语句。此时 j=4。

        在做,while():

          1. j=j-2 ; j=2;它打印“嗨”; j+=1 ; j=3; j!=0 ?是的
          1. j=j-2 ; j=1 ;它打印“嗨”; j+=1 ; j=2; j!=0 ?是的
          1. j=j-2 ; j=0 ;它打印“嗨”; j+=1 ; j=1; j!=0 ?是的
          1. j=j-2 ; j=1 ;它打印“嗨”; j+=1 ; j=0; j=0 ? no -> 离开 do while()

        在你最后输入 for 语句。

        • ++x 被称为预增量(变量在表达式评估之前递增)
        • x++后自增(变量在表达式评估后自增
        • 我不确定,您需要查看此信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-24
          • 1970-01-01
          • 1970-01-01
          • 2020-08-26
          相关资源
          最近更新 更多