2

次のコードを検討してください。

int i;
while(i=0)
    printf("Hello");

現在、一般的に言えば、 i=0 はチェック対象であり、チェック対象ではassignmentありません。しかし、コンパイラは警告を出してそれを許可し、正しく評価します (print ステートメントを実行しません)。conditionwhileGCC

なんで?私は通常、真理値の括弧を使用しますが、後輩は私が間違っていると感じており、これに括弧を付ける本当の理由はありません!

編集:「実際の」疑いをゼロにする、次のテストケースを検討してください

int callme(){
    return 0;
}

int main(int argc,char*argv[]){
    int c;
    while(c = callme()){
        printf("Calling...\n"); 
    }
    return 0;    
}
4

4 に答える 4

9

この式i = 0は次の 2 つのことを行います。

  • o を格納するという副作用がありますi
  • 値 0 を返します

私は通常、真理値の括弧を使用しますが、後輩は私が間違っていると感じており、これに括弧を付ける本当の理由はありません

これは通常、「私は実際にこれが欲しいのですが、忘れていませんでした=、黙ってください」という意味のコンパイラへのヒントです。


あなたの特定のケースでは、書く理由if (i = 0)はありません. if (0) が何をするかはすでに知っています. しかし、次のように使用すると非常に便利です。

if ((i = some_function()))
    ...
于 2012-05-30T04:34:31.637 に答える
2

次のような代入演算子を使用する場合

a=0;

'a'に値を割り当てても、数値0を返します。


あなたの質問をテストするために、私はこれらのコード行を試しました:

int a;
printf("%d", a=0);

これらの行は0を表示しました。

次に、別のコードセットをテストしました。

int b;
printf("%d", b=15);

ここでは、15行が表示されています。


だから、あなたがそうするなら:

while(a=0)
{
    printf("zero");
}

(a = 0)ステートメントはfalseを返すため、何も表示されません。

しかし、あなたがそうするなら:

while(a=15)
{
    printf("fifteen");
}

ステートメント(a = 15)はゼロ以外の値、つまり15を返すため、「15」は際限なく表示されます。これはfalseではなく、ゼロではないため、trueです。:)

于 2012-05-30T04:53:58.810 に答える
2

i=0は常に割り当てです (int i = 0;初期化の一部として割り当てられている場合を除きます)。ただし、非 void 式はwhileループの条件内に出現する可能性があり、それがゼロ以外に評価される場合、ループの本体が実行され、それがゼロの場合、ループの本体は実行されません。

表記:

while (i = 0)
    printf("Hello\n");

は常に次と同等です。

i = 0;

ループを書く正当な理由はほとんどありません。

人々は他の表現を書きます:

while (c = getchar())
    ...process EOF or a non-null character...

しかし、それは通常バグです。あなたが書くべきである可能性が高いです:

while ((c = getchar()) != EOF)
    ...process a character - possibly null...

あるいは:

while ((c = getchar()) != EOF && c != '\0')
    ...process a non-null character...

最初のgetchar()ループは GCC から警告を受けます。後者の 2 つは、割り当てからの値の明示的なテストのためではありません。

このような条件を書く人:

while ((c = getchar()))

本当に私を悩ませます。GCC からの警告を回避しますが、(IMNSHO) 良いコーディング方法ではありません。

于 2012-05-30T04:42:52.273 に答える
1

cnicutar が上で述べたように、割り当ても値ゼロを生成します。

いくつかの追加情報:

余分な '=' を省略して比較が割り当てになるのは、よくあるコーディングの間違いです。

これを回避する簡単な方法は、以下のように比較を記述することです。この場合、'=' が抜けていても、コンパイラはエラーを出します。

while(0 == i)
{
  prinf("Hello");
}
于 2012-05-30T04:37:21.153 に答える