1

i が for ループで定義されている場合、次が機能しないのはなぜですか

#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); ...)

これにより、 とという名前の 2 つの新しい内部変数が定義されます。特に、新しい変数は外側の変数を隠し、内側のスコープ内では一時的にアクセスできなくなります。したがって、外部変数は初期化されず、 を計算すると、その初期化されていない値を使用して結果が計算されます。iltltltans = 2*ans-(lt*lt)

于 2013-10-07T05:03:28.423 に答える
0

C でコーディングを開始するときに探すべき 1 つの適切なパターンは、値が本来あるべき範囲をはるかに超えている変数です。

したがって、あなたの場合、期待してい20た代わりに を取得しました1243068212。これは、変数が適切に開始されなかったため、値が未定義のメモリであることを意味します(間違っている場合は修正してください)。

ここに初期化に関する良い記事があります - http://publications.gbdirect.co.uk/c_book/chapter6/initialization.html

于 2013-10-07T05:09:47.650 に答える