C语言学习笔记(七)——其他运算符

来源:互联网 发布:linux 增加home空间 编辑:程序博客网 时间:2024/05/29 11:03


第七章                         其他运算符

 

逗号运算符

        逗号运算符:即顺序点,逗号前先执行,后再执行。

        for循环的执行次数:

                  for(i=n; i<m; ++i) //for循环共执行了m-n次,当m-n<0时,即for循环一次也不执行。

                  for(i=n; i<m; i+=k)//for循环共执行了(m-n)/k次,当有小数时,向前进1,当m-n<0时,即       for循环一次也不             执行。

 

 

三目(元)运算符

                  格式:A ? B : C;

                  由三部分组成,由问号?和冒号:隔开,A成立,执行BA不成立,则执行C

        等价于:

                  if(A)

                      B;

                  else

                      C;

 

自增运算符

            前自增:++i (i1后的值,即i+1)

            后自增:i++i1前的值,即i

            前自减:--i (i1后的值,即i-1)

            后自减:i--i1前的值,即i

注意:

        1、编程时应该尽量屏蔽掉前自增(减)和后自增(减)的区别;

        2i++ ++i应该单独成一个语句,不要把它作为一个完整复合语句的一部分来使用

        如:

                  intm = i++ + ++i + i + i++; //这样写不但是不规范的代码,而且是不可移植的代码

             printf("%d %d %d", i++, ++i,i);  //这样写不但是不规范的代码,而且是不可移植的代码

        即在 int m = i++ + ++i + i + i++;中,i的值是否增加,在i++++i中是否已经改变是不清楚的。

        有关顺序点的问题

        顺序点:逗号:,括号:(表达式)分号:;

        加号+不是顺序点,不知其i++是否已经计算生效

        

# include <stdio.h>

 

int main(void)

{

        inti, j, k, m;

        

        i= j = 3;

        k= ++i; //计算后i = i + 1,即结果i值加1

        m= j++; //计算后j = j + 1,即结果j值加1

        

        printf("i= %d, j = %d, k = %d, m = %d\n", i, j, k, m);

        

        return0;

}

/*

        结果:

        i= 4, j = 4, k = 4, m = 3

        Pressany key to continue

        总结:

        前自增与后自增

                  相同处:都是使ij的值加1,即i = i + 1, j = j + 1;

                  不同处:前自增整体表达式的值是i1之后的值,即先计算 ++,值为i+1;

                           后自增整体表达式的值是i1之前的值,即值为i;

*/

 

位运算符

        & -- 按位与   && --逻辑与,也叫并且)

                  k= i & j; //表示将两个数的二进制代码对应的每一位都进行与操作

                  运算法则:

                           1&1= 1

                           0&1= 0

                           1&0= 0

                           0&0= 0 //每一位与1相与还为原数,与0相与全为0,可依此来判断一个数据每一位的数字。

        | -- 按位或    || --逻辑或,也叫或者)

                  k= i|j; //表示将两个数的二进制代码对应的每一位都进行或操作

                  运算法则:

                           1|1= 1

                           1|0= 1

                           0|1= 1

                           0|0= 0 // 只有当两位全为0时结果才为0

        ~ -- 按位取反

                  ~i表示把i的变量的所有二进制代码全部取反(包括用于补齐的01)。

        ^ -- 按位异或

                  运算法则:相同为0,不同为1

                           1^1= 0

                           1^0= 1

                           0^1= 1

                           0^0= 0

        << -- 按位左移

                  即将有效数字位左移,左移n位相当于乘2n次方。(二进制即乘2n次方,十进制就是乘10n次方,如小数点的移动)

                  i<<3表示把i的二进制代码左移3位,右边补0

                  面试题:

                           Ai = i*8;

                           Bi = i<<3;

                           请问上述两个语句,哪个语句的执行速度快?

                           答案:B快。因为A语句要动用硬件的乘法器进行乘法运算,B仅用位运算器即可。

        >> -- 按位右移

                  即将有效数字位右移,右移n位相当于除以2n次方,进行位运算前提是数据不能丢失。

                  i>>3表示把i的二进制代码右移3位,左边正数补0,负数补1

        位运算的意义:通过位运算符我们可以对数据的操作精确到每一位,若不用位运算只能精确到字节。

1 0
原创粉丝点击