一:理解函数声明:
float num1,num2;//含义:对其求值时num1,num2是浮点型的。
float ((num1)); //含义:对其求值时((num1))是浮点型的,由此可知num1也是浮点型的。
float ff(); //含义:表达式ff()求值的结果是一个浮点数,也就是说ff是一个返回值为浮点数的函数
float *pf; //含义:*pf是一个浮点数,pf是一个指向浮点数的指针。
以上的几种声明还可以组合起来,就像在表达式中进行组合的一样。
ex:
float *g(); //表示:该函数的返回值类型为指向浮点数的指针,
float (*h)() //表示:h所指向的函数返回浮点型
(float (*)()) //表示:指向返回值为浮点类型的函数指针的类型转换符
(*(void(*)())0)() //构造这类表达式只需要按照使用的方式声明
二:运算符的优先级问题:
例1.if((flags & FLAGS) != 0)
不能写成
if(flags & FLAGS != 0)
因为 != 的优先级高于&。
例2.假设hi与low是0——15之间的整数,而res是一个整数且高四位与hi完全一致,且低四位与low完全一致,不能写成
res = hi<<4 + low;
因为+的优先级要高于<<。故而上式其实就相当于res = hi << (4 + low);
应该写成:res = (hi << 4) + low;或者res = hi << 4 | low; //注:|的优先级低于<<
说明:用括号虽然能够解决优先级的问题,但是程序当中用太多的括号则会降低程序的可读性。
优先级最高:数组下标操作符,函数调用操作符,各种结构成员的选择操作符。结合方式为自左向右。
优先级次之:单目运算符。*P++;相当于*(P++)
优先级次之:双目运算符。优先级由高到低:算数——>移位——>关系——>逻辑——>条件
三:语句结束标志的分号:
ex:
if(a>b);
y=x;
和
if(a>b)
y=x;
完全不同,分别相当于执行了:
if(a>b)
{}
y=x;
和
if(a>b)
{
y=x;
}
缺了分号同样会造成很大的危险:
ex:
if(n<3)
return
logrec.date = x[0];
logrec.time = x[1];
logrec.code = x[2];
分析:return后面缺少一个分号,但是程序会编译通过,只是将logrec.date = x[0]当做程序的返回值。即:
if(n<3)
return logrec.date = x[0];
logrec.time = x[1];
logrec.code = x[2];
四.switch语句
使用该语句时要注意case选项后面的break。因为C语言中把case标号当做真正意义的标号,因此程序的控制流程会径直通过case语句。而不会受到任何影响。
如果程序员“刻意”省去某一个case的break,则会表达出用其它语言难以表达的一些控制结构。
五.函数调用:
C语言中即使函数不带参数,也应该有参数列表。
ex:
f();
而如果写成
f;
则表示该处什么都不做,更确切的说这个语句计算函数f的地址。却不调用该函数。
六:“悬挂”else引发的问题:
else始终与同一对括号内最近的未匹配的if结合。在使用的时候要注意用括号制定if的范围等等。
阅读(1475) | 评论(0) | 转发(0) |