首页 > 解决方案 > 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:我错了,你们是对的,语言障碍(很可能是愚蠢)当然是造成误解的原因哈哈。抱歉,感谢您的帮助!

标签: cfor-loopsyntax

解决方案


您不小心回答了自己的问题:

...在这种情况下,我只想在循环之前初始化这些变量,假设因为我想在循环完成后访问这些值...

考虑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可能会抱怨,但它很常见,它会通过大多数代码审查员,让您了解它是否可以完成。


推荐阅读