アカウント名:
パスワード:
門外漢だけどさ。(プログラムなんてExcel VBAしかやったことねーっつーの)なんでCの次(?)をC++にしたわけ?Cの次は普通Dだろ?Dから進んだらEじゃないか。それをC++だのObject-CだのC#だのと…。
永久Betaのサービスとか、すでにたくさん使われてるのに未だにVersion が1以下のソフトとか、ある日突然バージョンがどかんとあがるソフトウエア並にわかりにくい!もしくはWindows Vistaのエディションの数とか、Linuxのディストリビューションの関係とか並にわかりにくい。
#単なる言いがかりなのでAC#まぁふさわしくないコメントだってのはわかってますはい。
if( C == C++ ){ /* C も C++ も一緒! */} else { /* "C/C++" はけしからん! */}
> C言語で C++ と書くと変数Cの値が1増やすという意味になります。(単項演算子の位置はその位置による動作の違いをかかねば…)
elseに飛ばしたければ、int C = 1;if( C == ++C ){; /* こっちにはこない */} else { ; /* こっちにくる */}/* この位置でのCの値はいずれも2 */ わかっちゃいるけど、間違えそうなので、評価時の単項演算子の使用はつい避けてしまう……
#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 の説明とは少し違う説明が必要ですが同様に未定義です。
どのような場合に結果が未定義になるかという正確な条件は、僕は理解していないので知りたければ言語仕様を読んでください。式の中のある箇所で変数の値を変更し、同じ式の中の別の箇所で同じ変数の値を参照すると、二つの箇所の評価順が言語仕様で決まっている場合を除き未定義になる、と思っておけば、そうそう間違ってはいないと思います。両方とも変更でも同様です。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生unstable -- あるハッカー
わかりにくいってんだよ! (スコア: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)
/* 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の値を比較に使っていますので未定義になります。