for语句和while语句后面有;的问题

时间:2022-09-08 15:12:27
如题,现在遇到了这样的问题。for和while本来是用来给出条件的,现在在它们后面加上了;代码如下

int i=0;
    while(i++ <= 2) ;
        printf("%d", i);




int a[4]={1,2,3,4}, i;
for(i=1;i<4;i++);
printf("%d",a[i]);



我和同学分析:第一个,当i>=2时循环终止,再加1,也就是输出3,但这是没有;的情形,现在这样的结果是4,没有头绪。
第二个分析是for只执行i++,到i=3时终止,所以执行完应该是4,而数组中不存在a[4]所以结果是随机的。实际运行结果是1638280(win7 x64,VC++6.0)。
希望大家帮忙解答。谢谢

10 个解决方案

#1



int main()
{
   
}

#2


第一个
while(i++<=2) 一直到i=2(条件是小于等于)也是满足条件的 等i=3时 条件才不满足,之后+1,也就变成了4

第二个
for循环的i++只是一个步进条件,表示i没有的变化方式,i++也就是循环一次+1,这里不用特别考虑前++后++
双还是在表达式中, for(1;2;3){4} 假设for循环的初始 条件 步进 语句 用1,2,3,4表示 那么执行顺序是
1-2-4-3-2-4-3-2-4-3 每次步进之后都会进行条件判断, 2,3不在同一个表达式中,不用再纠结了,就像是
i++;
if(i<4);

++i;
if(i<4);
这样需要纠结吗?
所以还要考虑之前之后的问题,进行条件判断的值就是i+1之后的值。

#3


忘了说一点,最后出来的是a[3]也就是4,你出来那个结果应该是配置错了

#4


其实楼主要理解i++与++i的区别.这个问题就解决了.
第一个.因为你写的都是 i++就是先使用,后自加.所以在这里在等于3时不小于等于2 退出循环.但因为是后置自加所以这时i还要再加一次,所以变成了4

第二个也是一样.因为最后, i变成了5了,造成访问越界.当然是随机数了,不过我是在想怎么能编译过去的.

不信你输出一下I看是多少?

#5


引用 4 楼  的回复:
其实楼主要理解i++与++i的区别.这个问题就解决了.
第一个.因为你写的都是 i++就是先使用,后自加.所以在这里在等于3时不小于等于2 退出循环.但因为是后置自加所以这时i还要再加一次,所以变成了4

第二个也是一样.因为最后, i变成了5了,造成访问越界.当然是随机数了,不过我是在想怎么能编译过去的.

不信你输出一下I看是多少?

不好意思,我运行的结果i等于4.你可以试一下。请注意一下for语句后面的分号,重点在这里,没有分号的没什么问题。
谢谢回答。

#6


引用 2 楼  的回复:
第一个
while(i++<=2) 一直到i=2(条件是小于等于)也是满足条件的 等i=3时 条件才不满足,之后+1,也就变成了4

第二个
for循环的i++只是一个步进条件,表示i没有的变化方式,i++也就是循环一次+1,这里不用特别考虑前++后++
双还是在表达式中, for(1;2;3){4} 假设for循环的初始 条件 步进 语句 用1,2,3,4表示 那么执行顺序是
1-……

您好,谢谢回答,不过我问的是while和for语句后面有;的情形,您说的好像是正常的条件吧,还有您说的我没有明白。

#7


看楼主的问题,头疼

#8


引用 6 楼  的回复:
您好,谢谢回答,不过我问的是while和for语句后面有;的情形,您说的好像是正常的条件吧,还有您说的我没有明白。


while(); 和 for(;;); 后面直接加个“;”,其实就是一条空语句,改一下会看的更清楚。

while(i++ < 2)
    ;
......

for (i = 1; i < 4; i++)
    ;
......

代码还是在按照条件进行判断,累加,只是后面跟了一条空语句,啥都没做,继续循环。这样做,是要得出退出循环时那些变量的值。



另外,楼主说:
“我和同学分析:第一个,当i>=2时循环终止,再加1,也就是输出3,但这是没有;的情形,现在这样的结果是4,没有头绪。”

你第一个循环中while(i++<=2);直接看i等于2的情况。i=2时,满足条件,循环会继续下去,因为i++的关系i此时加1,i=3。循环体为空,啥都不做,继续判断。这个时候i=3, 已经不满足i<=2这个条件了,需要退出循环,但i++的副作用必须完成,这时候i又加了1,从3变成4.

#9


引用 8 楼  的回复:
引用 6 楼  的回复:


您好,谢谢回答,不过我问的是while和for语句后面有;的情形,您说的好像是正常的条件吧,还有您说的我没有明白。



while(); 和 for(;;); 后面直接加个“;”,其实就是一条空语句,改一下会看的更清楚。

while(i++ < 2)
    ;
......

for (i = 1; i < 4; i++)
    ;……


谢谢,我终于明白。 

#10


新手见解:
楼主的学习精神值得学习,不过我不知道for语句后面加;号的意义,我觉得一般别人看了都是当错误处理,也会影响后面的人阅读你的程序,所以不建议故意用这种加;的,宁愿多写多一行代码,也希望楼主以后往主流的c知识研究,

#1



int main()
{
   
}

#2


第一个
while(i++<=2) 一直到i=2(条件是小于等于)也是满足条件的 等i=3时 条件才不满足,之后+1,也就变成了4

第二个
for循环的i++只是一个步进条件,表示i没有的变化方式,i++也就是循环一次+1,这里不用特别考虑前++后++
双还是在表达式中, for(1;2;3){4} 假设for循环的初始 条件 步进 语句 用1,2,3,4表示 那么执行顺序是
1-2-4-3-2-4-3-2-4-3 每次步进之后都会进行条件判断, 2,3不在同一个表达式中,不用再纠结了,就像是
i++;
if(i<4);

++i;
if(i<4);
这样需要纠结吗?
所以还要考虑之前之后的问题,进行条件判断的值就是i+1之后的值。

#3


忘了说一点,最后出来的是a[3]也就是4,你出来那个结果应该是配置错了

#4


其实楼主要理解i++与++i的区别.这个问题就解决了.
第一个.因为你写的都是 i++就是先使用,后自加.所以在这里在等于3时不小于等于2 退出循环.但因为是后置自加所以这时i还要再加一次,所以变成了4

第二个也是一样.因为最后, i变成了5了,造成访问越界.当然是随机数了,不过我是在想怎么能编译过去的.

不信你输出一下I看是多少?

#5


引用 4 楼  的回复:
其实楼主要理解i++与++i的区别.这个问题就解决了.
第一个.因为你写的都是 i++就是先使用,后自加.所以在这里在等于3时不小于等于2 退出循环.但因为是后置自加所以这时i还要再加一次,所以变成了4

第二个也是一样.因为最后, i变成了5了,造成访问越界.当然是随机数了,不过我是在想怎么能编译过去的.

不信你输出一下I看是多少?

不好意思,我运行的结果i等于4.你可以试一下。请注意一下for语句后面的分号,重点在这里,没有分号的没什么问题。
谢谢回答。

#6


引用 2 楼  的回复:
第一个
while(i++<=2) 一直到i=2(条件是小于等于)也是满足条件的 等i=3时 条件才不满足,之后+1,也就变成了4

第二个
for循环的i++只是一个步进条件,表示i没有的变化方式,i++也就是循环一次+1,这里不用特别考虑前++后++
双还是在表达式中, for(1;2;3){4} 假设for循环的初始 条件 步进 语句 用1,2,3,4表示 那么执行顺序是
1-……

您好,谢谢回答,不过我问的是while和for语句后面有;的情形,您说的好像是正常的条件吧,还有您说的我没有明白。

#7


看楼主的问题,头疼

#8


引用 6 楼  的回复:
您好,谢谢回答,不过我问的是while和for语句后面有;的情形,您说的好像是正常的条件吧,还有您说的我没有明白。


while(); 和 for(;;); 后面直接加个“;”,其实就是一条空语句,改一下会看的更清楚。

while(i++ < 2)
    ;
......

for (i = 1; i < 4; i++)
    ;
......

代码还是在按照条件进行判断,累加,只是后面跟了一条空语句,啥都没做,继续循环。这样做,是要得出退出循环时那些变量的值。



另外,楼主说:
“我和同学分析:第一个,当i>=2时循环终止,再加1,也就是输出3,但这是没有;的情形,现在这样的结果是4,没有头绪。”

你第一个循环中while(i++<=2);直接看i等于2的情况。i=2时,满足条件,循环会继续下去,因为i++的关系i此时加1,i=3。循环体为空,啥都不做,继续判断。这个时候i=3, 已经不满足i<=2这个条件了,需要退出循环,但i++的副作用必须完成,这时候i又加了1,从3变成4.

#9


引用 8 楼  的回复:
引用 6 楼  的回复:


您好,谢谢回答,不过我问的是while和for语句后面有;的情形,您说的好像是正常的条件吧,还有您说的我没有明白。



while(); 和 for(;;); 后面直接加个“;”,其实就是一条空语句,改一下会看的更清楚。

while(i++ < 2)
    ;
......

for (i = 1; i < 4; i++)
    ;……


谢谢,我终于明白。 

#10


新手见解:
楼主的学习精神值得学习,不过我不知道for语句后面加;号的意义,我觉得一般别人看了都是当错误处理,也会影响后面的人阅读你的程序,所以不建议故意用这种加;的,宁愿多写多一行代码,也希望楼主以后往主流的c知识研究,