ifの使い方

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

ifの使い方

#1

投稿記事 by usoire » 6年前

if(A==0)&&(B==0)||(C==0)||(D==0)
とした場合処理はどのよようになるのでしょうか。

Loki
記事: 22
登録日時: 7年前

Re: ifの使い方

#2

投稿記事 by Loki » 6年前

演算子には優先順位というものがあります。
http://ja.wikipedia.org/wiki/C%E3%81%A8 ... 7%E5%AD%90
それに沿って考えると、
( (A==0) && (B==0) ) || C==0 || D==0
と同じです。
&&の方が優先順位が高いので、先に評価されます。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: ifの使い方

#3

投稿記事 by みけCAT » 6年前

アセンブリを見てみるのもいいことです。

コード:

#include <stdio.h>

void test(void) {
	int A=1,B=2,C=3,D=4;
	if((A==0)&&(B==0)||(C==0)||(D==0))puts("test");
}
このコードをコンパイル(gcc -S -o if_dousa.s if_dousa.c)すると、こうなりました。

コード:

	.file	"if_dousa.c"
	.section .rdata,"dr"
LC0:
	.ascii "test\0"
	.text
	.globl	_test
	.def	_test;	.scl	2;	.type	32;	.endef
_test:
LFB6:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	subl	$40, %esp
	movl	$1, -12(%ebp)
	movl	$2, -16(%ebp)
	movl	$3, -20(%ebp)
	movl	$4, -24(%ebp)
	cmpl	$0, -12(%ebp)
	jne	L2
	cmpl	$0, -16(%ebp)
	je	L3
L2:
	cmpl	$0, -20(%ebp)
	je	L3
	cmpl	$0, -24(%ebp)
	jne	L1
L3:
	movl	$LC0, (%esp)
	call	_puts
L1:
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE6:
	.def	_puts;	.scl	2;	.type	32;	.endef
このうち、「subl $40, %esp」の次の行から「leave」の前の行までが主な処理の内容です。
日本語にすると、

コード:

Aに1を代入する
Bに2を代入する
Cに3を代入する
Dに4を代入する
Aが0でなかったらL2に行く
Bが0ならL3に行く

*ここをL2と呼ぶ*

Cが0ならL3に行く
Dが0でなければL1に行く

*ここをL3と呼ぶ*

「test」と出力する

*ここをL1と呼ぶ*
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

超絶右留斗羅天才プログラマー
記事: 44
登録日時: 6年前

Re: ifの使い方

#4

投稿記事 by 超絶右留斗羅天才プログラマー » 6年前

日本語にしてみようと思いましたが、私もさっぱりでしたので、プログラムで解決することにしました。

コード:

#include <stdio.h>

void main(){
	for( int A=0; A<2;A++ )
	for( int B=0; B<2;B++ )
	for( int C=0; C<2;C++ )
	for( int D=0; D<2;D++ )
	if((A==0)&& (B==0)|| (C==0)|| (D==0))
		printf("○%d,%d,%d,%d\n",A,B,C,D);
	else
		printf("×%d,%d,%d,%d\n",A,B,C,D);

}
結果は以下のようになりました。

コード:

○0,0,0,0
○0,0,0,1
○0,0,1,0
○0,0,1,1
○0,1,0,0
○0,1,0,1
○0,1,1,0
×0,1,1,1
○1,0,0,0
○1,0,0,1
○1,0,1,0
×1,0,1,1
○1,1,0,0
○1,1,0,1
○1,1,1,0
×1,1,1,1
A=0,B=1,C=1,D=1の時と、
A=×1,B=0,C=1,D=1の時と、
A=×1,B=1,C=1,D=1の時は実行されません。

それ以外は実行されます。

力技ですみません(*´ω`*)
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%

かずま

Re: ifの使い方

#5

投稿記事 by かずま » 6年前

Loki さんが書きました: &&の方が優先順位が高いので、先に評価されます。
本当ですか?
(A==0) || (B==0) && (C==0)
はどう解釈しますか?

non
記事: 1097
登録日時: 9年前

Re: ifの使い方

#6

投稿記事 by non » 6年前

usoire さんが書きました:if(A==0)&&(B==0)||(C==0)||(D==0)
とした場合処理はどのよようになるのでしょうか。
エラーになるんじゃないかな?
non

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: ifの使い方

#7

投稿記事 by みけCAT » 6年前

non さんが書きました:
usoire さんが書きました:if(A==0)&&(B==0)||(C==0)||(D==0)
とした場合処理はどのよようになるのでしょうか。
エラーになるんじゃないかな?
そうでした!これが正解でした!!
コンパイラの処理を聞いている、ということでしょうか。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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