为了账号安全,请及时绑定邮箱和手机立即绑定

大神,请问一下for中的测试条件k*k<26,放在printf("k=%d\n",k)后可以,放在printf("k=%d\n",k)前,为什么就不行了?


#include <stdio.h>
int main(void)
{
int k;
for (k=1,printf("%d: Hi!\n",k);printf("k=%d\n",k),k*k<26;k+=2,printf("Now k is %d\n",k))
printf("k is %d in the loop\n",k);
return 0;
}


正在回答

4 回答

因为for循环第二个表达式即k*k<26,是关系表达式,其作用就是满足这个条件,循环继续进行。

for循环只要找到第二个表达式语句,得到判断结果就行了。你的print()写在k*k<26之前,for循环想得到其判断结果,肯定要把print走过去;相反,你把k*k放在printf之前,for循环先找到k*k<26得到了判断结果,就没必要运行后面的printf了

记住了,第1个和第3个表达式可以有多个表达式,中间这个起判断作用的表达式,就一个表达式

1 回复 有任何疑惑可以回复我~
#1

weixin_慕侠3329338 提问者

我突然明白,是不是第二个测试表达式中只会以逗号运算符最后的表达式为准? 也就是说k*k在printf之前并没有起到测试的作用,程序会继续读取printf,但是printf又不能限定范围,所以就无限循环,而把k*k放在printf之后,当程序运行完printf后,再运行k*k发现限定的范围,所以不会无限循环。 这是我自己的笨拙的理解,不知道有没有道理。
2019-07-06 回复 有任何疑惑可以回复我~

C语言for循环,第1和3个表达式可以有多个表达式,但通常编程阶段只写一个,这样有利于阅读,也便于代码构建。第2个表达式是for循环结束的条件,规定必须是一个表达式,但是哥们,你偏要搞特殊。。。

如果一定要写,请把写法改成K*K<26&&printf();这样就变成了规定的一个表达式,也达成了你想要的效果。

另外告诉你为什么会无限循环,因为在for循环条件,如果写了多个表达式,用逗号分割,如果出现了相同变量的重复定义,那么for循环,就以最后一个表达式为准,如你写kk<26,printf(%d,k)。这就是两个表达式都重复用到了k,那么for循环就会以最后一个printf为准,但printf没有任何判断循环退出的条件,只有打印,所以会无限循环。


最后,写代码要符合规范啊,不符合规范,你就会如此麻烦,甚至编译器都不让你运行

0 回复 有任何疑惑可以回复我~
#1

weixin_慕侠3329338 提问者

谢谢你的耐心解答,我明白了。 这个例子是c primer plus的书上看到的,我当时就好奇为什么一定要把k*k放后面,就动手把它放前面,结果就无限循环了,所以一直搞不懂,你这么已解释,我就懂了。再次谢谢你!
2019-07-06 回复 有任何疑惑可以回复我~
#2

海浴飞鸥 回复 weixin_慕侠3329338 提问者

不客气,相互指教
2019-07-06 回复 有任何疑惑可以回复我~

我突然明白,是不是第二个测试表达式中只会以逗号运算符最后的表达式为准?

也就是说k*k在printf之前并没有起到测试的作用,程序会继续读取printf,但是printf又不能限定范围,所以就无限循环,而把k*k放在printf之后,当程序运行完printf后,再运行k*k发现限定的范围,所以不会无限循环。

这是我自己的笨拙的理解,不知道有没有道理。

0 回复 有任何疑惑可以回复我~

非常感谢您的回答。但是把k*k放printf前面就会出现无限循环。

https://img1.sycdn.imooc.com//5d1fec630001698e09520504.jpg

https://img1.sycdn.imooc.com//5d1fec630001849609760659.jpg

第二个表达式,为什么k*k放在printf后面就可以,但是放到printf前面反而就是无限循环了呢?而且k*k<26完全不受控制,但是它后面的printf(“k=%d\n”,k)也读取了。想不通了。


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

大神,请问一下for中的测试条件k*k<26,放在printf("k=%d\n",k)后可以,放在printf("k=%d\n",k)前,为什么就不行了?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信