苏嵌 项目实战
学习日志 姓名: 日期:
|
|
今日学习任务 |
|
今日任务完成情况 |
基本完成 |
今日未解决问题 |
无 |
其他 |
无 |
问题一:*和.、[]、()结合起来怎么看?
答:首先.、[]、()的优先级都是第一级,比*优先级要高,所以*和这几个结合在一起的时候先不看*,而是看.、[]、()结合后的整体,*是修饰这个整体的。
表达式 |
正确结果 |
*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
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;。