Posts Tagged ‘运算符’

September 14, 2010

See this,

1
2
3
4
5
6
7
8
9
10
int
main()
{
    int x = -1,
        y = -1,
        z = 0;
    printf("%d\n", ++x || ++y && ++z);
    printf("%d, %d, %d\n", x, y, z);
    return 0;
}

  别说我无聊,没人(正常人)会写出这样的式子,但有些细节知道总比不知道的好。
  &&比||优先级高。
  但优先级和求值顺序是两码事。
  ||和&&的求值顺序都是从左到右。其它运算符只有三目运算和逗号运算符有特定顺序,而+ – * /等的操作数均无特定的求值顺序,即f(x) + g(x++)中那个函数首先被调用是未定义的。顺便提一句,函数的参数的求值顺序与其入栈顺序也是无关的,所以f(i++, i++, i++)的行为也是未知的。

Tags: . 130 views
August 18, 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
	call ___main
	movl $1,-4(%ebp) ; a
	movl $2,-8(%ebp) ; b
	movl -4(%ebp),%eax ;if/else开始
	cmpl -8(%ebp),%eax
	jge L2
	movl -4(%ebp),%eax
	movl %eax,-12(%ebp)
	jmp L3
	.p2align 4,,7
L2:
	movl -8(%ebp),%eax
	movl %eax,-12(%ebp) ; if/else结束
L3:
	movl -8(%ebp),%eax ; ? :开始
	cmpl -4(%ebp),%eax
	jle L4
	movl -4(%ebp),%eax
L4:
	movl %eax,-12(%ebp) ; ? :结束

if/else用了8条指令,?:用了5条,这个差距可不算小了啊!因为,程序里面是要有循环的,多数循环里面会有分支语句,且很多情况下是二分支。
呃……又学到一个单词,ternary:三元。:-)

Tags: ,. 13 views
Page 1 of 11