C陷阱与缺陷之语法陷阱

    2.1理解函数声明

    任何C变量的声明都由两部分组成:类型以及一组类似表达式的声明符号。例如

    float f;

    这个声明的含义是:当对其求值时,表达式f和g的类型为浮点数类。因为声

    明符与表达式的相似,所以我们也可以在声明符中任意使用括号:

    float ((f))

    这个声明的含义是:当对其求值时,W)的类型为浮点类型,由此可以推知,f也是浮点类型。类似的,

    float *g(),(*h)();

    表示*g()(*h)()是浮点表达式。因为()结合优先级高于**g()也就是*(g()):g是一个函数,该函数的返回值类型为指向浮点数的指针。同理,可以得出h是一个函数指针,h所指向函数的返回值为浮点类型。

    理解了上面的知识后,我们就可以分析signal函数了,signal函数的原型为:

    #include <signal.h>

    void ( *signal ( int signo ,void (*func)(int) ) ) ( int );

    signal函数原型说明该函数需要两个参数,返回一个函数指针,而该指针所指向的函数需要一个整型参数,无返回值。第一个参数signo是一个整数,第二个参数是函数指针,它所指向的函数需要一个整型参数,无返回值。用自然语言描述也就是要向信号处理程序传递一个整型参数,而它却无返回值,当调用signal设置信号处理程序时,第二个参数是指向该函数(也就是信号处理程序)的指针。signal的返回值则是指向之前的信号处理程序的指针。

     

    2.2运算符的优先级问题


        优先级最高者其实并不是真正意义上的运算符,包括:数组下标、函数调用操作符各结构成员选择操作符。它们都是白左于右结合,因此a.b.c的含义是(a.b).c,而不是a.(b.c)。

        单目运算符的优先级仅次于前述运算符。在所有的真正意义上的运算符中,它们的优先级最高。因为函数调用的优先级要高于单目运算符的优先级,所以如果p是一个函数指针,要调用p所指向的函数,必须这样写:(*p)()。如果写成*p(),编译器会解释成*(p())。类型转换也是单目运算符,它的优先级和其他单目运算符的优先级一样。单目运算符是白右至左

    结合,因此*p++会被编译器解释成*(p++),即取指针p所指向的对象,然后将p递增1:而不是(*p)++,即取指针p所指向的对象,然后将该对象递增1。

       优先级比单目运算符要低的,接下来就是双目运算符。在双目运算符中,算术运算符的优先级最高,移位运算符次之,关系运算符再次之,接着是逻辑运算符,赋值运算符,最后是条件运算符(为三目运算符)。

    我们需要记住的最重要的两点是:

    1.任何一个逻辑运算符的优先级低于任何一个关系运算符。

    2.移位运算符的优先级比算术运算符要低,但是比关系运算符要高。

        在所有的运算符中,逗号运算符的优先级最低。这一点很容易记住,因为逗号运算符常用于在需要一个表达式而不是一条语句的情形下替换作为语句结束标志的分号。

     

    2.3注意作为语句结束标志的分号

        在C程序中如果不小心多写了一个分号可能不会造成什么不良后果:这个分号也许会被视作一个不会产生任何实际效果的空语句;或者编译器会因为这个多余的分号而产生一条警告信息,根据警告信息的提示能够很容易去掉这个分号。一个重要的例外情形是在if或者while语句之后需要紧跟一条语句时,如果此时多了一个分号,那么原来紧跟在if或者while了句之后的语句就是一条单独的语句,与条件判断部分没有了任何关系。考虑下面的

    这个例了:

        if(x [i]>big);

            big=x[i];

     

    2.4 switch语句

    switch语句中要注意case后面加break,这样才能起到控制的作用。当然有些时候,故意不加break以达到某种效果。

     

    2.5悬挂else引发的问题

    C语言中if else配对规则:else始终同一对括号内最近的为匹配的if结合。

    例如这样就可能和违背编程者的本意:

    if(x==0)

    if(y==0) error();

    else{

    z = x + y;

    }

    缩进后,成这样

    if(x == 0)

    if(y == 0)

    error();

    else{

    z= x + y;

    }

    为了避免这种情况,在ifelse后面都要加花括号

相关文章
相关标签/搜索