C == C++ の場合は、(C++)に関してインクリメントの前に評価を実施します。そのため、C == C++は真となることが言語的に保証されています。 C FAQ 3.2 [kouno.jp]で記述があるインクリメンタル演算子を使った場合の未定義というのは、書き換えを実施する文を複数含む場合の振る舞いが定義されていないということです。
(ですので、C == C++ ではなく、C = C++ なら、未定義になります)
Chapter 3 of D&E: ``I picked C++ because it was short, had nice interpretations, and wasn't of the form "adjective C."' In C, ++ can, depending on context, be read as "next," "successor," or "increment," though it is always pronounced "plu
わかりにくいってんだよ! (スコア:0)
門外漢だけどさ。(プログラムなんてExcel VBAしかやったことねーっつーの)
なんでCの次(?)をC++にしたわけ?
Cの次は普通Dだろ?Dから進んだらEじゃないか。
それをC++だのObject-CだのC#だのと…。
永久Betaのサービスとか、すでにたくさん使われてるのに未だにVersion が1以下のソフトとか、ある日突然バージョンがどかんとあがるソフトウエア並にわかりにくい!
もしくはWindows Vistaのエディションの数とか、Linuxのディストリビューションの関係とか並にわかりにくい。
#単なる言いがかりなのでAC
#まぁふさわしくないコメントだってのはわかってますはい。
Re:わかりにくいってんだよ! (スコア:0)
C言語で C++ と書くと 変数Cの値が1増やすという意味になります。
Re:わかりにくいってんだよ! (スコア:2)
Re: (スコア:0)
/* C も C++ も一緒! */が結果ですが (スコア:0)
> C言語で C++ と書くと変数Cの値が1増やすという意味になります。(単項演算子の位置はその位置による動作の違いをかかねば…)
elseに飛ばしたければ
、
int C = 1;
if( C == ++C ){
; /* こっちにはこない */
} else {
; /* こっちにくる */
}
/* この位置でのCの値はいずれも2 */
わかっちゃいるけど、間違えそうなので、評価時の単項演算子の使用はつい避けてしまう……
Re:/* C も C++ も一緒! */が結果ですが (スコア:3, 参考になる)
#1566914 [srad.jp] のプログラムも #1566926 [srad.jp] のプログラムも、 C 言語標準では結果は未定義であり、 if 文のどちら側が実行されても、どちらも実行されなくても、実行が終わった後なぜか変数 C の値が 42 になっていても、実行時エラーになっても、コンパイルエラーになっても、文句は言えません。 C FAQ 3.1, 3.2, 3.3, 3.8, 3.9 [kouno.jp], 11.33 [kouno.jp] を参照してください。 C++ 言語標準でも、 C FAQ 3.8 の説明とは少し違う説明が必要ですが同様に未定義です。
どのような場合に結果が未定義になるかという正確な条件は、僕は理解していないので知りたければ言語仕様を読んでください。式の中のある箇所で変数の値を変更し、同じ式の中の別の箇所で同じ変数の値を参照すると、二つの箇所の評価順が言語仕様で決まっている場合を除き未定義になる、と思っておけば、そうそう間違ってはいないと思います。両方とも変更でも同様です。
未定義じゃないです(Re:/* C も C++ も一緒! */が結果ですが) (スコア:1)
C FAQ 3.2 [kouno.jp]で記述があるインクリメンタル演算子を使った場合の未定義というのは、書き換えを実施する文を複数含む場合の振る舞いが定義されていないということです。
(ですので、C == C++ ではなく、C = C++ なら、未定義になります)
たとえば、C FAQ 3.2 [kouno.jp]で示されている (i++ * i++)に関しては、次のように評価されます。
・右のi++のインクリメントを実施する前に、右のi++の評価を実施します。
・左のi++のインクリメントを実施する前に、左のi++の評価を実施します。
・右のi++のインクリメントを実施する前に、左のi++の評価を実施するかどうかは定義されていません。
・左のi++のインクリメントを実施する前に、右のi++の評価を実施するかどうかは定義されていません。
このコードは定義されていない部分の実装によって結果が変わるので、「あいまいなコード」であると言えます。そのため、このコードは未定義と判断されます。
Re:未定義じゃないです(Re:/* C も C++ も一緒! */が結果ですが) (スコア:1)
C == C++ のインクリメンタルが、左辺のCの評価の前に実施されるかどうか定義されていませんね。
なんで、投稿する前に気づかないんだろ。 orz
失礼しました。
Re: (スコア:0)
代入演算子が書き込む変数を、代入する値の計算以外に読み出すのは未定義
というのがあります。つまり、
C == C++
は、左辺で読んだ変数Cの値を比較に使っていますので未定義になります。
Re: (スコア:0)
>C == C++
これって未定義動作になりませんか?
大丈夫でしたっけ?
Re:わかりにくいってんだよ! (スコア:2)
> これって未定義動作になりませんか?
その未定義なことについて議論するのが
このストーリーのお題ですよ(違) ;-P
Re: (スコア:0)
# "未定義"についての議論ではない?
Re: (スコア:0)
左辺と右辺のどちらの評価を先にするという事が 文法上定義されていない限り、結果は未定義でしょう。
進化してるのか退化したのかはさておき (スコア:1)
そして C/C++ と書くと...
ピコーン(AA略
"C/C++"って言語つくったら一緒くたにされにくいんじゃね?
Re: (スコア:0)
さすがにそれくらい判ってて書いてるんだと思いたいが、
じゃあ彼はいったい何が言いたかったのかと言われるとさっぱり判らない
Re:わかりにくいってんだよ! (スコア:1)
超訳に挑戦してみた。
「オレのわからない話題で盛り上がってんじゃねーよ!オレも混ぜれ!」
・・・寂しがりやさん?
Re: (スコア:0)
わかりにくいって言ってるのに「それに意味があります」なんて言われてもわかりにくいよね。
#プログラマってだから感覚がおかしいって言われるんだよ
Re:わかりにくいってんだよ! (スコア:2)
Re:わかりにくいってんだよ! (スコア:2, すばらしい洞察)
「わかりにくい」
というのはつまりわかってないってことなので
「わからないならすっこむなり、勉強するなりして来い!この物知らず!」
といいたくなるわけですが、そういうと角が立つのでより婉曲に/優しく
「(知らない貴方にはわからないかもしれないですが)それには意味があるんですよ?(微笑)」
となってるんじゃないかと。
Re: (スコア:0)
「わかりにくい」というのはつまりわかってないってこと
違う違う。理解したところで理解しにくかった事実はかわらんよ。
Re:わかりにくいってんだよ! (スコア:1)
…まぁそうね。
既にわかってるヒトが教えるときなどに「うーん、まぁここはわかりにくいかもね。」と使うこともなくはないか。
でもそういうときは「わかりにくい」といったヒトは既に納得できていて説明もできるはず。だから表題のような「わかりにくいってんだよ!」にはならない。
そういう意味では正確を期すならば:
>「わかりにくいってんだよ!」というのはつまりわかってないってこと
と書くべきであったかもしれない。
ところで、私自身は初見から今までCとC++の名前についてカケラも「わかりにくい」と思ったことはないけどね。C++の名前ネタは大抵の解説文に良く書かれてるかなりメジャーな薀蓄だってのもあるけど。
Re: (スコア:0)
> ところで、私自身は初見から今までCとC++の名前についてカケラも「わかりにくい」と思ったことはないけどね。C++の名前ネタは大抵の解説文に良く書かれてるかなりメジャーな薀蓄だってのもあるけど。
私は本家FAQで初めて知りました。
http://www.research.att.com/~bs/bs_faq.html#name [att.com]
Chapter 3 of D&E: ``I picked C++ because it was short, had nice interpretations, and wasn't of the form "adjective C."' In C, ++ can, depending on context, be read as "next," "successor," or "increment," though it is always pronounced "plu
Re: (スコア:0)
それは暴論でしょ。あなたが分かっているものを「わかりやすい」「わかりにくい」に分けたらすべて「わかりやすい」だけに入りますか? 自分が分かってしまったことのなかにも「わかりにくい」ものがあって当然だと思います。
Re: (スコア:0)
じゃ、じゃぁ C の中には何が入っていたんですか!?