C中的赋值和条件检查

Assignment and Conditional check in C

我遇到了下面这个程序,但我不明白输出。

有人可以解释一下吗?

#include <stdio.h>

int main()
{
  int i=1,j=1;
  for(;j;printf("%d %d\n",i,j))
  j=i++ <=5;
  return 0;
}

它的输出是:

2 1
3 1
4 1
5 1
6 1
7 0
#include <stdio.h>

int main()
{
  int i=1,j=1;

  //for(initialisation; condition; operations)
  // here no initialisation, 
  // 1. condition is j, if j is true 
  // 2. then it will execute block statements 
  // 3. then finally it execute operations, here printf
  // 4. again check step 1.

  for(;j;printf("%d %d\n",i,j))
  j=i++ <=5;  // j = (i <= 5); i++;
  return 0;
}

你的问题可以简化如下

#include <stdio.h>
int main()
{
  int i=1,j=1;
  while(j) {   
    j = (i++ <=5);
    printf("%d %d\n",i,j);
  }
  return 0;
}

由于 Ajay 提供了原始代码的替代代码(为方便起见,我将在下面复制粘贴)

#include <stdio.h>

int main()
{
  int i=1,j=1;
  while(j) {   
    j = (i++ <=5);
    printf("%d %d\n",i,j);
  }
  return 0;
}

现在,让我们看一下while循环的执行

i=1,j=1,j为True,循环中,j=(1<=5)=true=1,i=2(post递增).

i=2,j=1,j为True,在循环中,j=(2<=5)=true=1,i=3(post递增).

i=3,j=1,j为True,在循环中,j=(3<=5)=true=1,i=4(post递增).

i=4,j=1,j为True,在循环中,j=(4<=5)=true=1,i=5(post递增)

i=5,j=1,j为True,在循环中,j=(5<=5)=true=1,i=6(post递增).

i=6,j=1,j为True,在循环中,j=(6<=5)=false=0,i=7(post递增).

i=7, j=0, j 为 False,跳出循环。

程序停止。

希望这个执行说明对您有所帮助。

以下语句:

j=i++ <=5;

在递增之前评估变量 i 的值。此评估值用于比较 <= 5。比较的结果将是 01,具体取决于条件是 false 还是 true

在这种情况下,它与将它写在两个单独的语句中具有相同的效果:

j = i <= 5;
++i;

for 循环的语法:

for (initialization Statement; check condition; increment/decrements operation)
{
       // codes 
}

初始化语句只执行一次。然后,评估检查条件。如果条件为 true(非零),则执行 for 循环体内的代码并更新更新表达式。如果条件为 false(0),则 for 循环终止。

在您的代码中,

j = 1 然后条件变为 true 并进入 for 循环体。然后,检查 j = i++ <= 5 = true,然后控制转到 increment/decrements 操作 部分并打印 i = 2j = 1.

然后,再次重复代码,直到测试条件为 false

同样可以这样表示:

#include <stdio.h>
int main()
{
  int i,j;
  for(i=1,j=1;j!=0;){
    j=i++ <=5;
    printf("%d %d\n",i,j);
  }
  return 0;
}

此处,按照 for 循环的约定。

  1. i&j初始化为1
  2. 检查条件是否j != 0
  3. i <= 5 所以 j 保持为 1 && i 变为 2(递增后)
  4. 打印i = 2, j =1
  5. 同样,i <= 5 所以 j 保持为 1 && i 变为 3(递增后)
  6. 打印i = 3, j =1
  7. 同样,i <= 5 所以 j 保持为 1 && i 变为 4(递增后)
  8. 打印i = 4, j =1
  9. 继续下去,j 变为 0,因为当 i 变得大于 5 时,情况变得更糟