ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュの演算子の優先順位

  • mixiチェック
  • このエントリーをはてなブックマークに追加
雑談トピでも良かったのですが、どれだけの人が引っかかってくれるか楽しみなので、
トピックを立てちゃいました。ゴメンナサイ(笑)

演算子の優先順位(と結合方向)のテストのため、以下のコードを書きました。
さて、a, b, c, x, y の値は何と表示されるでしょうか?

もちろん、実行すれば分かりますが、
まずは実行せず、頭の中で考えてみてください。


$ cat operator1.cpp

#if 0
program=operator1;
g++ -Wall -O2 -o bin_${program} ${program}.cpp;
exit 0;
#endif

#include <iostream>

int main(int argc, char * argv[])
{
int a = 10;
int b = 2;
int c = 3;

a *= b += c;
std::cout << "a = " << a
<< "\nb = " << b
<< "\nc = " << c
<< std::endl;

double x, y;

x = 1,5 + 2;
y = (1,5 + 2);
std::cout << "x = " << x
<< "\ny = " << y
<< std::endl;
return ( 0 );
};

コメント(11)

中身よりも先頭のメークの書き方に感心しました。
なるほど、たしかにこういう書き方でコンパイルできますね、面白い。
答えを出すのをもう一寸待とうかと思いましたが、
殆ど、答えを言われちゃいましたね。
前半部分は、
足し算より、掛け算が先なので、
a = 23 と勘違いする人を期待しましたが(笑)

複合代入演算子の場合は、優先順位は同じなんですよね。
結合方向は、右から左。
なので、
a *= b += c は、 掛け算足し算関係なくて、
a *= (b += c)
後は、ねこじま さんの仰るとおり。
後半は、カンマでだましておいて、
そこに気づいたとしても、
カンマ演算子と代入演算子の優先順位が問題でした。

この二つの優先順位は特に低いですが、
さぁ、どっちが上だったか、意外と忘れている人多いんじゃないでしょうか?

y の方は、明示的にカッコをつけているので、7 と分かりますが、
さて、x の方は、1 それとも 7?
と言う問題でした。
>>[5]

実はこれ、5年ほど前に、ネットで偶々見つけたのを、気に入って。

今回のようなコードの断片(トイコード/実験コード)の場合にはいつもこれですね。

実験コードの場合、大抵ソースファイルは壱個。
ソースファイルが壱個しかないなら、Makefile を使う意味無いし。
かと言って毎回コマンド打つのも嫌。

これだと、
bash operator1.cpp
または、
chmod u+x operator1.cpp
./operator1.cpp
でコンパイルできるので、楽ですよ。
勿論、#if 〜 #end の間をコピーしてターミナルに貼り付けてもいいですが。

ちなみに、各行の末にある、セミコロンは不要ですが、
付けておかないと、emacs がインデントをグチャグチャにする場合があります。
>>[5]

ちなみに、少し解説しておくと、
最後の、exit 0 は必須です。

シェルがインタープリターなので、1行ずつ実行していくから、
シェルスクリプト中に、変なコードがあっても、
それを実行する前に、exit 等で実行が終わった場合は、
特にエラーにもならないのを利用してますね。

なので、exit 0 を書き忘れると、
int main( の行でシェルスクリプトとしては不正な文法なのでエラーを吐きます。
まぁ、その行まで到達した時点でコンパイルは終わってますから、無視してもいいですが。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング