2013-10-07 268 views
1

为什么以下不是当它被定义时,我在被定义为循环INT I for循环VS不

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

回答

6

当你这样写:

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

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

+0

+1。乍一看,问题可能似乎是C++风格“int i”。但实际上,它是表达式'int i = 1,lt = sqrt(N)',它创建了两个* NEW *变量“i”,* AND *“lt”。 – paulsm4

+0

@ paulsm4:这不是一个“表达”。这是一个声明。 – AnT

+0

该声明* IS *表达式。 “表达式是用于一个或多个这些目的的操作符和操作数的序列。” – paulsm4

0

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

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

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