7

if ステートメントの括弧内でローカル変数を宣言したいと考えています。例えば。

if((char c = getc(stdin)) == 0x01)//This is not OK with g++.
{
    ungetc(c, stdin);
}

私が欲しいのは、キャラクターが私が望むものであるかどうかを確認することです. よく言えば、変数(char c)はifの行とifの本体の両方で使いたいが、 ifの外では使いたくない

しかし g++(GCC 4.8.1) は、 'char' の前に期待される一次式を示しています。私はそのようなことをしたくないので、それを行う方法があるのだろうか

char c = getc(stdin);
if(c == 0x01)
{
    bla...
}
4

3 に答える 3

17

心配している名前空間の汚染である場合は、いつでもifブロック内でステートメントを定義できます。

{
    char c = getc(stdin);
    if(c == 0x01)
    {
        // ...
    }
}

そのcため、ブロックの最後に到達するまでしか持続しません。

于 2013-07-11T02:42:23.253 に答える
8

ステートメント内で変数をうまく定義できます。ifたとえば、これはコンパイルする必要があります。

if (int ch = getchar())
    ;

問題は、タイプ (例: ) が左括弧の直後intに続く必要があることです。あなたが持っている余分な括弧は、コンパイルが失敗する原因です。したがって、本当にこれを行いたい場合は、少し賢く、次のようなものを使用する必要があります。

if (char ch = 0 || ((ch = getchar()) == 0x1))

chこれにより、完了の作成と初期化を取得し式のその部分が完了したら、を括弧で囲んch=getchar()で代入と比較の優先順位をオーバーライドできます。

&&and||は短絡評価を行うことに注意してください。そのため、初期化には注意が必要です。次のいずれかを使用できます。

if (char ch = 0 || ...

...また:

if (char ch = 1 && ...

...しかし、if (ch = 1 || ...orを使用しようとするとif (ch = 0 && ...、短絡評価により、正しいオペランド (本当に関心のある部分) がまったく評価されなくなります。

ここで注意点: このコードが標準の要件に適合しており、現在のほとんど (すべて?) のコンパイラがそれを受け入れると合理的に確信している一方で、コードを読んでいるほとんどのプログラマは、あなたが何をしたかを理解するために深刻な頭を悩ませる可能性があります。 、 なぜ。この「手法」を実際のコードで使用することについて、私は(せいぜい)非常に躊躇します。

編集: この結果は、当初の予想よりもさらに誤解を招く可能性があることが指摘されているため、状況を明確にしようと思います。何が起こるかというと、入力から値が読み取られます。その値は に割り当てられch、比較され0x1ます。ここまでは順調ですね。その後、比較の結果 (整数に変換されるため、 または のいずれ01) が に代入されchます。結果が定義された動作になるのに十分なシーケンスポイントがあると思います。しかし、それはおそらくあなたや他の誰かが望んでいるものではないでしょう。つまり、おそらくこれを使いたくないというアドバイスであり、ほとんどのプログラマーが頭を悩ませ、あなたが何をしようとしているのか疑問に思うだろうという言及です。0x1 と比較する非常に特殊なケースではchifステートメントは になりますが1、多かれ少なかれ偶然です。ch0x2と比較した場合、 の値はではなくのifままです。12

于 2013-07-11T03:16:48.987 に答える