c语言运算符方面的问题

苏嵌                                                                                                                              项目实战

学习日志                                     姓名:                      日期:

 

 

 

今日学习任务

  1. 运算符简介
  2. 条件运算符和条件表达式
  3. 使用位操作优化性能

今日任务完成情况

基本完成

 

今日未解决问题

其他

 

 

问题一:*和.、[]、()结合起来怎么看?

        答:首先.、[]、()的优先级都是第一级,比*优先级要高,所以*和这几个结合在一起的时候先不看*,而是看.、[]、()结合后的整体,*是修饰这个整体的。

表达式

正确结果

*p.f

*(p.f)

int *a[]

int *(a[])

int *f()

int *(f())

例如:

 

 

 

 

 

 

 

这几个例子可以看出,当*和.、[]、()结合的时候,去掉*,而看这几个结合后的整体,然后再把*修饰这个整体就好了。

 

问题二:位操作符&、|、^和==、!=结合起来怎么看?

        答:看个表达式:val&mask!=0这个式子是怎么结合的?估计有人会说是val&mask结合起来不等于0,然而这样是错的。==和!=的优先级要高于位运算符&、|、^,而且这几个都是双目运算符,都是从左到右,所以结合的时候,!=要先和mask结合,即(mask!=0)是一个整体,然后这个整体再与val相&,最后结果是val&(mask!=0)。

 

问题三:算术运算符和位移运算符<<、>>向结合起来怎么看?

        答:看个表达式:mask<<4+ps。这个式子是mask右移4位,再与ps相加吗?还是要先看符号优先级。算术运算符+的优先级是要高于位移运算符<<的,所以表达式中的4不是先和<<结合,而是先和ps相结合,即(4+ps)是一个整体。最后结果是mask<<(4+ps)。

 

问题四:逻辑运算符||和&&容易出现的错误。

        答:代码:

int i=0,j=0;

if((++i>0)||(++j>0)) printf(“i=%d, j=%d”,i,j);

最后结果是多少?答案是i=1, j=0。这是因为在进行||运算符左右只要有一个是对的就可以了,如果是左边对的,即++i>0成立,则||运算符功能已经完成,对右边的++j>0不再进行计算,所以j还是初值0。

 

问题五:c语言中’ , ’的作用?

        答:代码:

#include<stdio.h>

int main()

{

    unsigned int a,b,c,d,e,f,g;

    g=(a=1*2,b=a*3,c=b*4,d=c*5,e=d*6,f=e*7,f*8,9);

    printf("%d\n",g);

        return 0;

}

最后g等于9。这是因为“,”连接的多个表达式中,之后最后一个逗号后面的表达式才是整个式子的值。

 

问题六:按位运算&的作用?

        答:按位与运算&通常可以用来对某些位清零或保留某些位。比如a=0111,现在要保留a的第二位,可作a=a&0010,这样a的就保留了第二位,其他位全部清零。

 

问题七:按位运算|的作用?

        答:按位运算|常用来将源操作数的某些位置一。比如a=0110,现在要将a的第一位置一,可作a|0001,这样a的第一位就被置一了。

 

问题八:位移运算符<<和>>的问题

        答:<<和>>分别是将操作数的二进制位向左移和向右移一位。但是要注意的是:<<向左移的时候,高位会被丢弃,地位补0。如果是负数的话,左移后符号位可能就变成0了。>>在右移的时候符号位也会移动。如果是正数,最高位补0,如果是负数,最高位补1。

 

问题九:如何用位运算对c语言性能优化?

        答:代码:

//源代码

int i,j;

i=257/8;

j=456%32;

//优化后

int i,j;

i=257>>8;

j=456-(456>>4<<4);

字面上看好戏优化后更烦了,但这是相对于人理解而言的。对计算机来说,源代码要调用除法和取余函数,这些函数又涉及到很多汇编和寄存器的使用,而优化后却只有几句汇编语句。对计算机来说速度就提高了。

 

问题十:条件运算符的应用。

        答:条件运算符的一般形式:表达式1?表达式2:表达式3。相当于if else的用法。

if(a>b) max=a;

else max=b;

用条件运算符:max=a>b? a:b;。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值