c - C for 循环,应该能够省略循环内部的初始化,但不能按预期工作
问题描述
所以我正在慢慢尝试从头开始学习 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 循环初始化是有效的,即使没有参数 (;;) 但在这种情况下,我只想在循环之前初始化这些变量,假设因为我想在循环完成后访问这些值,它只是没有t 似乎像它应该的那样工作。
英语不是我的主要语言,因此请提前为任何问题道歉。
有人可以解释是什么问题吗?
编辑1:所以,我不知道是我的英语不好还是其他原因。我说过,如果我在循环之前声明并初始化变量,就像在我向您展示的代码中一样,它只会通过最内层循环(ipotenusa)并且它会使用以下输出值:1 1 1 then 1 1 2 然后 1 1 3 依此类推,唯一增加的数字是最后一个(ipotenusa);在我们达到 1 1 500 之后,程序突然结束。然后我说,如果我正常初始化变量,即在 for 循环指令中,那么它会按预期工作。
即使早些时候宣布,也没有理由它不应该工作。它应该增加的变量值。到目前为止,唯一有用的答案是在循环外初始化一个变量,但在循环语句中为其赋值,但这不是我需要的答案,因为我应该能够跳过循环内的初始化完全声明。
编辑2:我错了,你们是对的,语言障碍(很可能是愚蠢)当然是造成误解的原因哈哈。抱歉,感谢您的帮助!
解决方案
您不小心回答了自己的问题:
...在这种情况下,我只想在循环之前初始化这些变量,假设因为我想在循环完成后访问这些值...
考虑ipotenusa
...的值,或者让您的程序在每个循环开始时打印出每个变量的值以进行调试。它看起来类似于以下日志。
lato1: 1
lato2: 1
ipotenusa: 1
ipotenusa: 2
ipotenusa: 3
ipotenusa: 4
ipotenusa: 5
lato2: 2
lato2: 3
lato2: 4
lato2: 5
lato1: 2
lato1: 3
lato1: 4
lato1: 5
内部循环永远不会“重置”,因为您正在保存值。你在这两个方面都没有错,但是你已经设置了两个相互冲突的需求,而 C 运行时只能给你一个。
基本上,lato2
并且ipotenusa
需要在它们的语句中进行初始化(但不一定要声明)for
,以便将它们设置为再次运行。
int lato1=1;
int lato2;
int ipotenusa;
for(;lato1 <= 5; lato1++){
for(lato2 = 1;lato2 <= 5; lato2++){
for(ipotenusa = 1;ipotenusa <= 5; ipotenusa++){
if (((lato1 * lato1)+(lato2 * lato2))==(ipotenusa*ipotenusa)){
printf("Tripletta %10d %10d %10d\n",lato1,lato2,ipotenusa);
}
}
}
}
值得指出的是,即使规范可能(或可能不会;我不记得并且现在太模糊无法查找)说循环变量只存在于循环期间,但我从未见过实现实际上就是这样做的,所以你会看到很多代码在里面定义变量for
并在之后使用它。它可能不是很好,像静态检查器这样的静态检查器lint
可能会抱怨,但它很常见,它会通过大多数代码审查员,让您了解它是否可以完成。
推荐阅读
- excel - 函数返回单元格值而不是单元格位置 - VBA
- css - 如何使 flexbox 中的 div 出现在下一行?
- python-3.x - 读取多个 csv 文件时保留文件名
- java - Tomcat URL 无法被另一台 PC 访问
- regex - 2 个文本模式后的修剪值
- java - Java android 谷歌地图改变我所在的颜色折线
- javascript - 从 Angular 反应式 FormArray 获取同级 AbstractControl - 自定义验证
- javascript - 使用ajax单击每个节点时如何将数据传递和显示到弹出窗口?
- node.js - 无法为量角器执行“webdriver-manager update”
- javascript - 无法使用 jquery 获取锚标记值