ステートメント内で変数をうまく定義できます。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
ます。ここまでは順調ですね。その後、比較の結果 (整数に変換されるため、 または のいずれ0
か1
) が に代入されch
ます。結果が定義された動作になるのに十分なシーケンスポイントがあると思います。しかし、それはおそらくあなたや他の誰かが望んでいるものではないでしょう。つまり、おそらくこれを使いたくないというアドバイスであり、ほとんどのプログラマーが頭を悩ませ、あなたが何をしようとしているのか疑問に思うだろうという言及です。0x1 と比較する非常に特殊なケースではch
、if
ステートメントは になりますが1
、多かれ少なかれ偶然です。ch
0x2と比較した場合、 の値はではなくのif
ままです。1
2