C 编程 while 循环
C Programming while loops
void main()
{
int a;
a=10;
do
while(a++<10);
while(a++<=11);
printf("%d",a);
}
以上程序给出了14
的输出。
你能解释一下为什么吗?
好吧,post 增量只会在评估条件后发生,因此即使条件为假,a
也会增加,并且可能会增加您期望的循环运行次数。
这段代码会让你明白为什么,每当你输入 a++ 它总是递增的
void main()
{
int a;
a=10;
do{
while(a++<10);
printf("%d",a);
}
while(a++<=11);
printf("%d",a);
}
此处您的代码计算为
int main()
{
int a;
a=10;
do{
//---> second iteration a= 12, for post iteration in while
while(a++<10); // First iteration: a=10 ,so false| second Iteration: a=12, so false
//First iteration: Here a=11, as previous line's post increment| Second iteration: here a=13, as previous post increment
} while(a++<=11); //First iteration: a==11, that evaluete true, go to --->, line after do | Second iteration: a=13, false, loop end goto next line
//Here a=14 for post increment in previous line's while loop
printf("%d",a); // a=14
}
In post increment 首先用当前值计算表达式,然后增加变量的值。
例如,在第二次迭代中,当程序在 while(a++<=11)
的外部开始执行时,这次 a=13
作为 a
的先前值。这个 a++<=11
执行和 return 0
使得 while(0)
(因为 a=13,大于 11)。然后发生递增,a 变为 14。因为 while(0)
它打破了 do-while 循环并转到下一条指令并打印值 14。
花括号会使它更具可读性,但正如你所拥有的,a 的执行流程和值在行中进行了解释:
哦,这是邪恶的。稍微重新格式化代码应该会显示发生了什么:
a=10;
do
{
while(a++<10);
}
while(a++<=11);
所以。 a
最初设置为 10
。我们进入 do while
循环。 do while
循环中唯一的语句是 while( a++ < 10 );
。请记住,表达式 a++
计算 为 a
的当前值,并且作为 副作用 递增 a
.
因此,a++ < 10
被评估。结果是 false
(10
不小于 10
),但作为对表达式求值的结果,a
递增并且现在具有值 11
.在 do while
循环结束时,我们计算 a++<=11
。计算结果为 true
,因为 a
当前的值为 11
。作为计算表达式的结果,a
递增到 12
.
我们再次执行 do while
循环体。再次计算表达式 a++ < 10
。和以前一样,结果是 false
,但是作为计算表达式的结果 a
递增到 13
.
然后我们再次评估a++ <= 11
。结果是 false
,因为 13
不小于或等于 11
,并且 a
再递增 一次 。
因此,当这整个混乱结束时,a
是 14
。
总结:
a
最初是 10
;
do while
循环进入
a++ < 10
被评估,a
现在是 11
a++ <= 11
被评估,a
现在是 12
,do while
循环重复
a++ < 10
被评估,a
现在是 13
a++ <= 11
被评估,a
现在是 14
,do while
循环退出。
void main()
{
int a;
a=10;
do
while(a++<10);
while(a++<=11);
printf("%d",a);
}
以上程序给出了14
的输出。
你能解释一下为什么吗?
好吧,post 增量只会在评估条件后发生,因此即使条件为假,a
也会增加,并且可能会增加您期望的循环运行次数。
这段代码会让你明白为什么,每当你输入 a++ 它总是递增的
void main()
{
int a;
a=10;
do{
while(a++<10);
printf("%d",a);
}
while(a++<=11);
printf("%d",a);
}
此处您的代码计算为
int main()
{
int a;
a=10;
do{
//---> second iteration a= 12, for post iteration in while
while(a++<10); // First iteration: a=10 ,so false| second Iteration: a=12, so false
//First iteration: Here a=11, as previous line's post increment| Second iteration: here a=13, as previous post increment
} while(a++<=11); //First iteration: a==11, that evaluete true, go to --->, line after do | Second iteration: a=13, false, loop end goto next line
//Here a=14 for post increment in previous line's while loop
printf("%d",a); // a=14
}
In post increment 首先用当前值计算表达式,然后增加变量的值。
例如,在第二次迭代中,当程序在 while(a++<=11)
的外部开始执行时,这次 a=13
作为 a
的先前值。这个 a++<=11
执行和 return 0
使得 while(0)
(因为 a=13,大于 11)。然后发生递增,a 变为 14。因为 while(0)
它打破了 do-while 循环并转到下一条指令并打印值 14。
花括号会使它更具可读性,但正如你所拥有的,a 的执行流程和值在行中进行了解释:
哦,这是邪恶的。稍微重新格式化代码应该会显示发生了什么:
a=10;
do
{
while(a++<10);
}
while(a++<=11);
所以。 a
最初设置为 10
。我们进入 do while
循环。 do while
循环中唯一的语句是 while( a++ < 10 );
。请记住,表达式 a++
计算 为 a
的当前值,并且作为 副作用 递增 a
.
因此,a++ < 10
被评估。结果是 false
(10
不小于 10
),但作为对表达式求值的结果,a
递增并且现在具有值 11
.在 do while
循环结束时,我们计算 a++<=11
。计算结果为 true
,因为 a
当前的值为 11
。作为计算表达式的结果,a
递增到 12
.
我们再次执行 do while
循环体。再次计算表达式 a++ < 10
。和以前一样,结果是 false
,但是作为计算表达式的结果 a
递增到 13
.
然后我们再次评估a++ <= 11
。结果是 false
,因为 13
不小于或等于 11
,并且 a
再递增 一次 。
因此,当这整个混乱结束时,a
是 14
。
总结:
a
最初是10
;do while
循环进入a++ < 10
被评估,a
现在是11
a++ <= 11
被评估,a
现在是12
,do while
循环重复a++ < 10
被评估,a
现在是13
a++ <= 11
被评估,a
现在是14
,do while
循环退出。