int for in for循环vs不

时间:2013-10-07 05:00:04

标签: c

为什么在for循环中定义i时,以下内容不起作用

#include <stdio.h>
#include <math.h>
int N;
long long int H() {

    long long int ans=0;
    int i, lt;

    if(N <= 0)
        return 0;

    for(i=1, lt=sqrt(N); i<=lt; i+=1) /* if i=1 is replaced by int i=1 => garbage */
        ans+=(N/i);

    ans = 2*ans-(lt*lt);
    return ans;

}
int main() {

    scanf("%d",&N);
    printf("%lld\n",H());

    return 0;
}

在顶部定义时输出

Input: 8
Output: 20

在for循环/* for (int i=1 ..) */

中定义时输出
Input: 8
Output: 1243068212

我看到我收到警告lt is initialized when used here,为什么?

2 个答案:

答案 0 :(得分:6)

当你这样写:

int lt;
for (int i=1, lt=sqrt(N); ...)

定义名为ilt两个新内部变量;特别是,新的lt变量阴影是外部的,使其在内部范围内暂时无法访问。因此,外部lt变量永远不会被初始化,当您计算ans = 2*ans-(lt*lt)时,它会使用该未初始化的值来计算结果。

答案 1 :(得分:0)

在C中开始编码时要寻找的一个好模式是值WAY超出其应有范围的变量。

所以在你的情况下,你期待20而不是1243068212,这意味着变量没有正确启动,因此它的值是一个未定义的内存(如果我是正确的我错)。

这是一篇关于初始化的好文章 - http://publications.gbdirect.co.uk/c_book/chapter6/initialization.html