C语言学习笔记

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编译器)


你可能感兴趣的:(c)