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
。比较的结果将是 0
或 1
,具体取决于条件是 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 = 2
和 j = 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
循环的约定。
- i&j初始化为1
- 检查条件是否
j != 0
i <= 5
所以 j 保持为 1 && i 变为 2(递增后)
- 打印
i = 2, j =1
- 同样,
i <= 5
所以 j 保持为 1 && i 变为 3(递增后)
- 打印
i = 3, j =1
- 同样,
i <= 5
所以 j 保持为 1 && i 变为 4(递增后)
- 打印
i = 4, j =1
- 继续下去,j 变为 0,因为当 i 变得大于 5 时,情况变得更糟
我遇到了下面这个程序,但我不明白输出。
有人可以解释一下吗?
#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
。比较的结果将是 0
或 1
,具体取决于条件是 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 = 2
和 j = 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
循环的约定。
- i&j初始化为1
- 检查条件是否
j != 0
i <= 5
所以 j 保持为 1 && i 变为 2(递增后)- 打印
i = 2, j =1
- 同样,
i <= 5
所以 j 保持为 1 && i 变为 3(递增后) - 打印
i = 3, j =1
- 同样,
i <= 5
所以 j 保持为 1 && i 变为 4(递增后) - 打印
i = 4, j =1
- 继续下去,j 变为 0,因为当 i 变得大于 5 时,情况变得更糟