0

次のようなステートメント (セミコロンの代わりにカンマ) が奇妙に見えることはわかっています。

 if(a<b)printf("Hello\n"),a+=5,b/=5,printf("%d,%d",a,b);

しかし、それは完全に正常に動作し、それはcommahereがシーケンスポイントとして機能するためだと読んでいました.私はこれを理解できますelse.

  if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b);

エラーが発生しますexpected expression before 'else'

2 番目のステートメントでエラーが発生するのはなぜですか?最初のステートメントでは、commaそれがシーケンス ポイントとして機能することを確認しました。では、なぜそれが前に機能しないelseのでしょうか?エラーを引き起こす 2 番目のケースの特別な点は何ですか?これが私の完全なプログラムです:

#include<stdio.h>

int main(void)
{
    int a=30,b=45;

    //if(a<b)printf("Hello\n"),a+=5,b/=5,printf("%d,%d",a,b); //Works well
    if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b); 

}
4

4 に答える 4

5

コンマ演算子には式が必要ですelseが、構造の一部は式でif elseはありません。したがって、カンマの後にキーワードelseが続くと、構文エラーになります。

于 2013-05-16T08:36:47.933 に答える
3

想像してみろ:

(a, b)

は次のように翻訳されます。

{
    a;
    return here b;
}

この場合、return hereは「この式の代わりに挿入する」ことを意味します。実際、,シーケンス ポイントとして機能します。

それで、

if (a<b) printf("Hello\n"), a+=5, b/=5, printf("%d,%d",a,b);

次のようになります。

if (a<b)
{
    printf("Hello\n");
    a += 5;
    b /= 5;
    return here printf("%d, %d", a, b);
}

しかし

if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b);

次のようになります。

if (a < b)
{
    printf("Hi\n");
    else printf("Bye\n");
    a += 5;
    b /= 5;
    return here printf("%d, %d", a, b);
}

そして、内部のelseは意味がありません。それがコンパイラの苦情の理由です。

つまり、,C++ では演算子です。したがって、演算子の優先順位により、

if(a<b)printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b);

と解釈されます

if(a<b) ( printf("Hi\n"),else printf("Bye\n"),a+=5,b/=5,printf("%d,%d",a,b) );

これは明らかに C++ 構文規則に違反しています。

于 2013-05-16T08:28:08.140 に答える
0

IF-ELSE ステートメントの正しい構文を見てください。コンパイラは、セミコロンが IF が終了したことを認識していることを期待しています。したがって、基本的に最初の if-else ステートメントにサブ if-else ステートメントを入力しようとしていますが、新しい if はありません。

if(a>=18 &a <=64)printf("adult\n"); 
else if(a<=17)printf("minor\n"); 
else printf("senior\n");

したがって、中かっこ "{}" は IF 領域を示します。または、中かっこがない場合は、最初のセミコロンまで IF ステートメントが有効です。

于 2013-05-16T08:34:16.580 に答える