为什么在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
,为什么?
答案 0 :(得分:6)
当你这样写:
int lt;
for (int i=1, lt=sqrt(N); ...)
定义名为i
和lt
的两个新内部变量;特别是,新的lt
变量阴影是外部的,使其在内部范围内暂时无法访问。因此,外部lt
变量永远不会被初始化,当您计算ans = 2*ans-(lt*lt)
时,它会使用该未初始化的值来计算结果。
答案 1 :(得分:0)
在C中开始编码时要寻找的一个好模式是值WAY超出其应有范围的变量。
所以在你的情况下,你期待20
而不是1243068212
,这意味着变量没有正确启动,因此它的值是一个未定义的内存(如果我是正确的我错)。
这是一篇关于初始化的好文章 - http://publications.gbdirect.co.uk/c_book/chapter6/initialization.html