たとえば以下のようなif文で、A B C が評価される順番は
言語の規約上、明確になっているのでしょうか?
if ( A && B && C ) { }
また例えば A, B, C の順番に評価されるとして、B が
FALSE の場合は C を評価する必要はありませんが、
この場合、Cは評価されないことは言語規約上、明確に
なっているのでしょうか?
手元のコンパイラで試した結果では
評価順は A -> B -> C
で B で FALSE を返すようにしたら C は実行されませんでした。
ただ、これが実装依存か、言語の標準仕様かという点が
気になっています。
No.1ベストアンサー
- 回答日時:
「A,B,Cの順に評価され、AがFALSEならB,Cは評価されず、AがTRUEでBがFALSEならCは評価されない」が標準仕様です。
論理AND演算子、論理OR演算子は左から右に評価され、第1オペランドだけで値が決定すると、第2オペランドの評価は行われません。
http://www.microsoft.com/japan/developer/library …
http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide2 …
http://www.st.rim.or.jp/~phinloda/cqa/cqa10.html …
No.6
- 回答日時:
オペランドの評価順序が決まっている演算子は
&&, || (第1オペランド→第2オペランドの順で, 第1オペランドで値が決まるなら第2オペランドは評価しない) と
?: (第1オペランド→第2オペランドまたは第3オペランドの順)
だけで, 逆にこれら以外は(最適化とは無関係に)不定となっています.
No.5
- 回答日時:
ちょっと気になったので投稿させていただきます。
> 順序をかえる場合があります。
確かに、意味が変わらない範囲内で「内部的には」実は評価の順序が変わっている、というのは今回の件に限らず最適化では普通にあることですが、
今回の話は、No.1~No.3の方の答えられたような順序で評価をしているように「外部からは」見えるという話であって、最適化による評価順序の変更とは切り分けたほうがよいように思います。
No.4
- 回答日時:
みなさんは、a,b,cの順に評価するとかかれていますが
実は、昔、古いコンパイラ等では、強力な最適化を
実現するために、同じ結果になることが確定された
場合、順序をかえる場合があります。
例えば・・・・Z80 (16bitレジスタが3つ)を例にします。
unsigned a,b,c; /* unsigned int */
a=23513;
if(a > 20000) {
b=15325;
if(b>10000) {
c=31252;
if (a && b && c) {
のような場合、実はレジスタ上に残っている数字は
b と c と 比較用の 10000 だけになります。
そうすると、最適化する上で、最初に b と c を
最初に比較することで、メモリからの読み出しの分
最適化することができます。
No.3
- 回答日時:
#1の方が回答されている通り、「A,B,Cの順に評価され、Aが偽ならB,Cは評価されず、Aが真でBが偽ならCは評価されない」のが標準仕様です。
通常、演算子のオペランドの評価順序は(演算子の優先順位とは関係なく)不定ですが、&&や||演算子等は例外的に評価順序が決められています。
厳密に言えば、||や&&演算では、第一オペランドの評価の直後が副作用完了点となっています。以後、詳しく調べたい場合は「副作用完了点」で調べてみてください。
なお、C++で&&や||演算子を多重定義した場合には、こうした動作にはなりませんので要注意です。
No.2
- 回答日時:
>たとえば以下のようなif文で、A B C が評価される順番は
>言語の規約上、明確になっているのでしょうか?
はい。「==」、「&&」などは演算子と呼ばれ、
優先順位が決められています。
慣れてくれば演算子の優先順位もある程度わかって
きますが、全部覚える必要はないでしょう。
()で優先順位を明確にするのも一つの手です。
http://www.bohyoh.com/CandCPP/C/operator.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- その他(教育・科学・学問) 質問です。教育用語で「評価計画」って何ですか?勝手な解釈として、年間指導計画の評価規準の部分のことを 1 2022/05/18 21:17
- メルカリ メルカリでHERMESのネックレスを売り、購入者から受け取り評価を貰ったのにも関わらず、偽物だから返 3 2022/12/16 11:07
- メルカリ メルカリでHERMESのネックレスを売り、購入者から受け取り評価を貰ったのにも関わらず、偽物だから返 1 2022/12/16 16:59
- ヤフオク! Q1)ヤフオクで落札直後、裁判がどうこう言ういきなり出品者の身勝手で落札者に対して失礼な自己満ルール 6 2023/08/12 10:57
- 会社経営 不当な人事評価 5 2022/07/24 11:02
- 英語 Therefore, it appears to be more logical to avoid 2 2022/07/05 15:31
- 外国株 評価損益 (ひょうかそんえき) 評価損益とは、保有資産の購入時の価格と現在の価格(時価)の差額のこと 4 2023/04/02 20:12
- その他(悩み相談・人生相談) これって普通ですか? 大学生です 授業中に英語のエッセイを書いていて 時間がないので事前準備をして行 1 2023/05/26 19:59
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
C言語での引数の省略方法
C言語・C++・C#
-
0除算して、落ちるプログラムと落ちないプログラム
C言語・C++・C#
-
#defineの定数を文字列として読み込む
C言語・C++・C#
-
-
4
戻り値を返す関数の前に(void)を付ける
C言語・C++・C#
-
5
CloseとDisposeの違い
Visual Basic(VBA)
-
6
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
7
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
8
char*を初期化したいのですが
C言語・C++・C#
-
9
関数から配列を返すには?
C言語・C++・C#
-
10
構造体のメンバをfor文で回したい
C言語・C++・C#
-
11
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
12
【C#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
-
13
C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して
C言語・C++・C#
-
14
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
15
変数の前のビックリマークについて!
PHP
-
16
0xffffとは?
C言語・C++・C#
-
17
C言語のポインターに関する警告
C言語・C++・C#
-
18
組み込みCプログラムで実数型
C言語・C++・C#
-
19
C言語 1文字入力(Enterキーなし)
C言語・C++・C#
-
20
バッファとは何ですか
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
音楽の鑑賞文
-
400字程度のレポートを誤って53...
-
C言語におけるif文の評価順
-
「高評価」と「好評価」の違い
-
なかなかウーバーイーツで評価...
-
仕返しの評価をされました。
-
ステーキ宮はひどすぎませんか?
-
スエーデンボルグの科学者とし...
-
評価と批評違い教えてください ...
-
「格付け」に代わる柔らかい表...
-
レビューで星5にして貶しまくっ...
-
英語で、頭にinがつくと否定語...
-
自分の評価、成果が欲しい人の...
-
@a.email.ne.jp ですが、届き...
-
「評価する」「評価しない」と...
-
ヤフーニュースのコメントで
-
WISC-IVの粗点から評価点への...
-
Amazon プライムビデオにおける...
-
ドクターストップのかかってい...
-
フリー素材で評価アイコンを探...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
京成電鉄の評価が急落しました...
-
音楽の鑑賞文
-
「高評価」と「好評価」の違い
-
C言語におけるif文の評価順
-
ヤフーニュースのコメントで
-
評価と批評違い教えてください ...
-
前期日程に失敗したことが落ち...
-
フェミニストが嫌がる事を教え...
-
ドクターストップのかかってい...
-
知恵袋のカテゴリマスターが嫌...
-
スエーデンボルグの科学者とし...
-
仕返しの評価をされました。
-
30ページ(枚)一行目でも30ペ...
-
@a.email.ne.jp ですが、届き...
-
「差し引く」の意味を教えてく...
-
400字程度のレポートを誤って53...
-
なかなかウーバーイーツで評価...
-
フリマアプリで普通評価を付け...
-
WISC-IVの粗点から評価点への...
-
ストイックで思慮深くて優秀な...
おすすめ情報