この記事は間違っていた。
この変更では、インクリメント演算子の副作用のコミット順序はまだ規定されていない。
paizaが以下のような質問を出している。
int i = 0;
— paiza[パイザ] (@paiza_official) December 26, 2016
のときに評価値が1になるのは
問題は、int i = 0 ;であるとき、以下の式を評価した結果が1になるのはどれかという問題だ。@paiza_official 【補足】C言語,C++,Javaを想定しています
— paiza[パイザ] (@paiza_official) December 26, 2016
- i++ + ++i
- ++i + ++i
- i++ + i++
- ++i + i++
C言語では、この式を評価した結果は未定義である。
C++14までは、この式を評価した結果は未定義である。
C++17では、サブ式の評価順序が固定されたことにより、この式は以下のように評価されることが規格上保証されている。
C++17でも未だに未定義。§1.10 p18に書かれている。
- 2
- 3
- 1
- 2
参考:
[PDF] P0145R3: Refining Expression Evaluation Order for Idiomatic C++
P0400R0: Wording for Order of Evaluation of Function Arguments
現在、Clang 4.0 headがP0145R3とP0400R0を正しく実装している。GCC 7 headはP0145R3の実装を謳っているが現時点ではバグのため、2番目の式の評価が4になるようだ。
ドワンゴ広告
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0
isocpp.orgの最新のDraft(http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4618.pdf)の12ページ下のExampleを見ると、
ReplyDeletei = i++ + i; // the behavior is undefined
となっているので、C++17でも「i++ + ++i」のような式の評価値も、undefinedなのかなとと思ってたのですが、どうなんでしょう?
あれ・・・
ReplyDeleteそれを変更し忘れているのだろうか。
ご確認ありがとうございます。undefinedなのですね・・・。
ReplyDelete
ReplyDeleteGreetings! Very helpful advice in this particular post!
It is the little changes which will make the largest changes. Thanks a lot for sharing!
Click here to chceck my blog :: 오피
(freaky)
ทางเข้า pg เกมสล็อต เล่นง่าย แตกง่าย การเล่นเกมออนไลน์ pg slot มีความนิยมและเป็นที่ต้องการของผู้คนในยุคปัจจุบัน โดยเฉพาะเกมสล็อตออนไลน์ที่เติบโตมากขึ้นเรื่อย ๆ
ReplyDelete