1、逻辑运算符 || &&
如果运算符左边的子表达式决定了最终的结果,则右边的子表达式不会计算
例如:
if(d != 0 && n/d > 0) {
/* average is greater than 0 */
}
if(p == NULL || *p == '\0') {
/* no string */
}
在第一个例子中,如果没有短路行为,一旦d=0,则右边的表达式会被0除--系统可能会崩溃;第二个例子中,如果p是空指针,则右边的表达式引用一个空地址,从而可能导致系统崩溃。
2、C语言实参求值顺序
C标准对实参的求值顺序并没有统一规定,但是多数系统对函数参数的求值顺序是自右向左。
i = 3; printf("%d, %d\n", i, i++);
输出结果是:4,3
3、i++ 与 ++i运算符
i = 3; j = (++i)+(++i)+(++i);
printf("j = %d, i = %d\n", j, i);
输出结果为:j = 16, i = 6(gcc编译器)
不同编译器,结果可能不一样。计算机在计算j = (a+b)+(c+d)+(e+f)时,先计算(a+b)+(c+d),并把结果存储(例如:存储在j中),然后再计算j+(e+f)=j;计算机中只有一个i,计算第二个i时,第一个i已改变。
int i = 1, j = 1, k;
i = (i++) + (++i);
k = (j++) + (++j);
printf("i = %d,j=%d, k=%d \n", i, j, k);
输出结果为:i = 5, j = 3, k = 4(gcc编译器)