5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

論理演算の評価順について

Posted at

今、

if(++iter != end && *iter == value) {/* ... */}

のようなコードを書いていてふと心配になった。短絡評価は保証されていただろうか? そしてそもそも評価順序は保証されていただろうか? 短絡評価が保証されていなければ、上のコードはSEGVしかねないし、評価順序が保証されていなければ、意図通り動くことが保証されない。

C++17以前は多くの式の評価順序が未規定だ。

std::cout << f() << g() << h(); // ???

詳細は以下を。
https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html

論理AND, ORの評価順序と短絡評価は保証されている

n3337(C++11直後)の§5.14, §5.15には、以下のような記述がある。非常に短いため、この部分だけならサラッと読めるので信用ならんという人は自分であたってみて欲しい。C++のドラフトはGitHubで公開されている。

N3337
5.14 論理AND演算子
...
&とは異なり、&&は左から右に評価されることが保証されている。最初のオペランドがfalseだった場合、2つめのオペランドは評価されない。
...
5.15 論理OR演算子
...
|とは異なり、||は左から右に評価されることが保証されている。さらに、最初のオペランドがtrueだった場合、2つめのオペランドは評価されない。

n4659では§8.14と§8.15になっている。

というわけで、論理and/orの評価順、そして短絡評価までが規格で保証されていることがわかった。安心してその振る舞いに依存することが出来る。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?