【发布时间】:2020-06-23 10:40:12
【问题描述】:
所以我正在慢慢尝试从头开始学习 C。 我在我正在使用的书中提出了一个练习:使用嵌套循环找到毕达哥拉斯三元组。现在我将显示代码。
#include <stdio.h>
int main(void){
int lato1=1;
int lato2=1;
int ipotenusa=1;
for(;lato1 <= 500; lato1++){
for(;lato2 <= 500; lato2++){
for(;ipotenusa <= 500; ipotenusa++){
if (((lato1 * lato1)+(lato2 * lato2))==(ipotenusa*ipotenusa)){
printf("Tripletta %10d %10d %10d\n",lato1,lato2,ipotenusa);
}
}
}
}
return 0;
}
现在,除了糟糕的格式和风格,除了shi*t优化, 如图所示的代码,不起作用。 它只执行最里面的循环,然后程序结束。
但是,如果我在每个循环中初始化每个变量/计数器,那么它就可以工作。 为什么? 我读到 for 循环初始化是有效的,即使没有参数 (;;) 但在这种情况下,我只想在循环之前初始化这些变量,假设因为我想在循环完成后访问这些值,它只是没有看起来不像它应该的那样工作。
英语不是我的主要语言,因此请提前向我道歉。
有人能解释一下是什么问题吗?
编辑1:所以,我不知道是我的英语不好还是其他原因。 我说过,如果我在循环之前声明并初始化变量,就像在我向您展示的代码中一样,它只会通过最内层循环(ipotenusa),并且它会使用以下输出值:1 1 1 then 1 1 2 然后 1 1 3 依此类推,唯一增加的数字是最后一个(ipotenusa);在我们达到 1 1 500 之后,程序突然结束。 然后我说,如果我正常初始化变量,即在 for 循环指令中,那么它会按预期工作。
即使之前声明了它也没有理由不工作。它应该增加的变量值。到目前为止,唯一有用的答案是在循环外初始化一个变量,但在循环语句中为其赋值,但这不是我需要的答案,因为我应该能够跳过循环内的初始化完全声明。
编辑 2:我错了,你们是对的,语言障碍(很可能是愚蠢)当然是造成误解的原因,哈哈。抱歉,感谢您的帮助!
【问题讨论】:
-
问问自己
lato2和ipotenusa的值是多少,这些循环开始的秒时间。他们都是501吗?如果是这样,为什么这些循环会第二次运行? -
换句话说,为什么这些变量会被重置为,呃,
0或1或42,除非你 设置它们?第一次可以省略它们的唯一原因是因为它们之前已设置 - 不涉及任何魔法。 -
有一种形式的
for循环有初始化,还有一种形式没有。它们都是有效的。但他们不做同样的事情。你为什么希望他们这样做? -
一旦最内层的
ipotenusa循环执行到最后一次(例如ipotenusa <= 500现在回答为假),发布的代码中的内容将永远 i> 允许该条件再次返回 true 吗?第一个嵌套循环和lato2 <= 500存在同样的问题。在这两种情况下,一旦它们的条件为假,它们将永远不会返回真,因此循环将永远不会再次进入正文。