1

为什么在 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,为什么?

4

2 回答 2

6

当你写这个:

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

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

于 2013-10-07T05:03:28.423 回答
0

在 C 语言中开始编码时要寻找的一种好模式是变量的值超出了它们应有的范围。

因此,在您的情况下,您期望20得到1243068212,这意味着变量未正确启动,因此它的值是未定义的内存块(如果我错了,请纠正我)。

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

于 2013-10-07T05:09:47.650 回答