ページ 11

ifの使い方

Posted: 2013年6月28日(金) 00:07
by usoire
if(A==0)&&(B==0)||(C==0)||(D==0)
とした場合処理はどのよようになるのでしょうか。

Re: ifの使い方

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

Re: ifの使い方

Posted: 2013年6月28日(金) 22:30
by みけCAT
アセンブリを見てみるのもいいことです。

コード:

#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と呼ぶ*

Re: ifの使い方

Posted: 2013年6月29日(土) 02:01
by 超絶右留斗羅天才プログラマー
日本語にしてみようと思いましたが、私もさっぱりでしたので、プログラムで解決することにしました。

コード:

#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の時は実行されません。

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

力技ですみません(*´ω`*)

Re: ifの使い方

Posted: 2013年6月29日(土) 04:30
by かずま
Loki さんが書きました: &&の方が優先順位が高いので、先に評価されます。
本当ですか?
(A==0) || (B==0) && (C==0)
はどう解釈しますか?

Re: ifの使い方

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

Re: ifの使い方

Posted: 2013年6月29日(土) 10:24
by みけCAT
non さんが書きました:
usoire さんが書きました:if(A==0)&&(B==0)||(C==0)||(D==0)
とした場合処理はどのよようになるのでしょうか。
エラーになるんじゃないかな?
そうでした!これが正解でした!!
コンパイラの処理を聞いている、ということでしょうか。