C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

C++の条件文に関する評価順番 /VNM (17/04/18(Tue) 14:15) #83876
Re[1]: C++の条件文に関する評価順番 /通りすがり (17/04/18(Tue) 15:00) #83877
Re[1]: C++の条件文に関する評価順番 /furu (17/04/19(Wed) 10:47) #83884
Re[1]: C++の条件文に関する評価順番 /shu (17/04/19(Wed) 11:39) #83885
Re[1]: C++の条件文に関する評価順番 /WebSurfer (17/04/19(Wed) 12:18) #83886
│└ Re[2]: C++の条件文に関する評価順番 /774RR (17/04/19(Wed) 13:01) #83887
Re[1]: C++の条件文に関する評価順番 /Jitta (17/04/21(Fri) 09:19) #83896
  └ Re[2]: C++の条件文に関する評価順番 / VNM (17/04/25(Tue) 21:26) #83936 解決済み


親記事 / ▼[ 83877 ] ▼[ 83884 ] ▼[ 83885 ] ▼[ 83886 ] ▼[ 83896 ]
■83876 / 親階層)  C++の条件文に関する評価順番
□投稿者/ VNM (1回)-(2017/04/18(Tue) 14:15:50)

分類:[C/C++] 

こんにちわ

ちょっと微妙な質問ですけれども
C++の場合、if文に関して条件判断順番に関するお決まりがあるでしょうか。

for(条件文1 && 条件文2)

必ず左側の条件文1が先に評価されるのでしょうか、
それとも、逆の事でしょうか。

要は簡単な条件文が先に評価してほしいのです===早くなるから

あくまでC++の標準規格に規定があるかどうかに関する質問で、
具体的なコンパイル実例に興味ありません。


ご教授宜しくお願いします
[ □ Tree ] 返信 編集キー/

▲[ 83876 ] / 返信無し
■83877 / 1階層)  Re[1]: C++の条件文に関する評価順番
□投稿者/ 通りすがり (1回)-(2017/04/18(Tue) 15:00:35)
[ 親 83876 / □ Tree ] 返信 編集キー/

▲[ 83876 ] / 返信無し
■83884 / 1階層)  Re[1]: C++の条件文に関する評価順番
□投稿者/ furu (93回)-(2017/04/19(Wed) 10:47:59)
No83876 (VNM さん) に返信
> あくまでC++の標準規格に規定があるかどうかに関する質問で、
> 具体的なコンパイル実例に興味ありません。

規定の話なら、JIS X3014に書いてあると思います。
書いてなければ、決まりはないということで。
[ 親 83876 / □ Tree ] 返信 編集キー/

▲[ 83876 ] / 返信無し
■83885 / 1階層)  Re[1]: C++の条件文に関する評価順番
□投稿者/ shu (1009回)-(2017/04/19(Wed) 11:39:19)
No83876 (VNM さん) に返信
> こんにちわ
>
> ちょっと微妙な質問ですけれども
> C++の場合、if文に関して条件判断順番に関するお決まりがあるでしょうか。
>
> for(条件文1 && 条件文2)
>
forと書いてあるけどifのことでよろしいでしょうか?


> 必ず左側の条件文1が先に評価されるのでしょうか、
> それとも、逆の事でしょうか。
>
> 要は簡単な条件文が先に評価してほしいのです===早くなるから
>
規定については既出の通りだと思いますが、読み解くのも大変かもしれませんので
ifをネストすれば確実かと思います。
if (条件1)
if (条件2)
{
}
とすれば確実に条件1が評価され、trueでなければ条件2は評価されません。



[ 親 83876 / □ Tree ] 返信 編集キー/

▲[ 83876 ] / ▼[ 83887 ]
■83886 / 1階層)  Re[1]: C++の条件文に関する評価順番
□投稿者/ WebSurfer (1222回)-(2017/04/19(Wed) 12:18:04)
No83876 (VNM さん) に返信

The C++ Programming Language Second Edition の 3.3.1 章に以下のように書いてあります。

The operators && and || will not evaluate their second argument unless it is neccessary.
For example:

if (p && 1<p->count) // ...

first tests that p is nonzero, and only if it is, tests 1<p->count.

そのあたりは C の時代から同じです。

質問者さんが使っているコンパイラがその通り実装されているかは分かりませんが。
[ 親 83876 / □ Tree ] 返信 編集キー/

▲[ 83886 ] / 返信無し
■83887 / 2階層)  Re[2]: C++の条件文に関する評価順番
□投稿者/ 774RR (512回)-(2017/04/19(Wed) 13:01:32)
組み込み型に適用される組み込み演算子 && や || は短絡評価。

JIS X 3014:2003 ISO/IEC 14882:1998 5.14 論理AND 5.15 論理OR
- 左→右の順に評価
- 左の部分式の値が [ AND:false ] [ OR:true ] なら、右の部分式は評価されない
- 左の部分式にある副作用は、右の部分式を評価する前に完了する(一時オブジェクトの解体を除く)

オレオレ operator && を実装すると短絡評価にならないことに注意。

bool operator&&(const T& lh, const T& rh) { ... }
T(0) && T(1);

両辺の T() 一時オブジェクトが両方生成される
T(0) と T(1) のどちらが先に構築されるかは未規定
T(1) が先に生成されても良い
両者の一時オブジェクトの解体は完全式の終了時点
解体は構築と逆順


[ 親 83876 / □ Tree ] 返信 編集キー/

▲[ 83876 ] / ▼[ 83936 ]
■83896 / 1階層)  Re[1]: C++の条件文に関する評価順番
□投稿者/ Jitta (290回)-(2017/04/21(Fri) 09:19:45)
No83876 (VNM さん) に返信
> 要は簡単な条件文が先に評価してほしいのです===早くなるから

簡単なのが先?
他の条件の前提条件が1番ですよね。
p != NULL && p->next == ... のような。
次は、以降の評価をしなくて良い条件では?
AとBのの評価をする。
Aは5単位時間かかるけど、3割方偽を返す。
Bは1単位で終わるけど、ほぼ間違いなく真を返す。
Bを先にすると、ほぼ必ず6単位時間かかる。
Aが先だと、3割は5単位時間で済む。
[ 親 83876 / □ Tree ] 返信 編集キー/

▲[ 83896 ] / 返信無し
■83936 / 2階層)  Re[2]: C++の条件文に関する評価順番
□投稿者/ VNM (1回)-(2017/04/25(Tue) 21:26:25)
皆様
感謝の気持ちいっぱいですね。
非常に勉強になりました。

本当にありがとうございました!
解決済み
[ 親 83876 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -