if文の[条件]での実行処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jun039

if文の[条件]での実行処理について

#1

投稿記事 by jun039 » 11年前

いつも活用させて頂いております。

今回質問したいのは、if文です(初歩的なものですみません。。。。)

コード:

if (fsync(hf) != 0 || close(hf) != 0) {
  ...
とした場合、必ず両方(fsync/close)とも実行されるのか?、それとも、
どちらか一方がtrueになれば抜けるのか?が知りたいです。

理想としては、両方実行された結果で判定を希望なのですが、、、、

vs2010 C++ Consoleで試した感じでは、最初の式がtrueの時点で抜けているように
みえました。

コード:

int call_a(int *a){
	*a -= 10;
	return 1;
}

int call_b(int *b){
	*b += 10;
	return 1;
}

main(){
	int a = 100;
	int b = 200;
	if(call_a(&a) || call_b(&b))
		printf("OK\n");
	else
		printf("NG\n");

	printf("a:%d, b:%d\n", a, b);
}

call_aのreturnを0にすると
-----
OK
a:90, b:210
-----

call_aのreturnを1にすると
-----
OK
a:90, b:200
-----

また、この処理部分は、Compilerで差があるのでしょうか?

申し訳ありませんが、教えていただきたいです。
よろしくお願いします。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: if文の[条件]での実行処理について

#2

投稿記事 by YuO » 11年前

今回の場合,標準準拠のコンパイラであれば,必ず前がtrueだった時点で後ろは実行されません。
両方を実行する必要があるのであれば,if文の前に処理を行い,結果を変数に代入しておいて,その変数if文の条件として使う必要があります。


論理AND (&&), 論理OR (||) の両演算子については,左辺のオペランドを先に評価し,
その結果が全体を律する場合は演算子の後のオペランドを評価しないと規格に定められています。
全体を律するというのは,&&の場合は前が0 (false) だった場合,||の場合は前が非0 (true) だった場合です。
0 (false) と何かのANDは常に0 (false), 非0 (true) と何かのORは常に非0 (true) なので,「何か」を評価する必要が無いためです。

refs)
ISO/IEC 9899:1999 6.5.13 Logical AND operator ¶4, ISO/IEC 9899:1999 6.5.14 Logical OR operator ¶4
ISO/IEC 14882:2011 5.14 Logical AND operator ¶1, ISO/IEC 14882:2011 5.15 Logical OR operator ¶1

jun039

Re: if文の[条件]での実行処理について

#3

投稿記事 by jun039 » 11年前

回答遅れました。

YuO さんへ
  回答ありがとうございます
  後ろは実行されないんですね。
  やはり、コンパイラは効率よく動作するようにできているんだなと感じます。

疑問が晴れて、すっきりました。
ありがとうございました!!

閉鎖

“C言語何でも質問掲示板” へ戻る