C专家编程学习之第二章

第二章 这不是bug,这是语言特性
    2.2 多做之过
    switch语句的一般形式如下
    switch (表达式)
    {
        case 常量表达式:零条或者多条语句
            default:零条或者多条语句
        case 常量表达式:零条或者多条语句
    }
    其中,对于default(如果有的话, 可以放在case列表的任何位置),各个case和default的顺序是任意的,但是习惯上总是把default放在最后。
    看一下下面一个程序:
    const int a = 2;
    int i = 3;

    switch (a)
    {
        case 1:
            break;
        case a:
            break;
        default:;
    }
    你觉得编译是否会出错?
    答案是肯定的,const修饰的只不过是可读的变量而已,并不是常量,之前我一直以为switch 后面跟的也是常量,后来才发现,原来switch后面跟的只要是表达式(表达式的值要为整数)就可以了,但是不可以是float,double类型的。注意,每条case语句后面最好加上break(当然有些时候是自己因为某些需求而故意不加的)。


    C语言中符号重载问题
    看下面的语句:
    p = N * sizeof * q;
   这里的乘号是一个还是两个?
   答案是:一个, 因为sizeof操作符把指针q所指像的东西(即*q)作为操作数,它返回q所指向对象的类型的字节数。不过一般情况下,我们还是在sizeof后面加上括号()比较好一点。
再看一下下面的例子:
apple = sizeof (int) * p;

这又是表示什么意思呢?

来看一下下面的测试程序:

#include <stdio.h>

int main (int argc, char *argv[])
{
    int apple = 0;
    int a = 10;
    int *p = &a;
    apple = sizeof(int) * p;

    printf ("apple = %d\n", apple);

    return 0;

}

编译时, 会出现:

test5.c:9: error: invalid operands to binary * (have ‘unsigned int’ and ‘int *’),

很明显, sizeof(int) *p的意思并不是把指针p强制转换成指向int *类型,再使用sizeof操作符进行操作。


结合性:

对于以下表达式:

int a, b = 1, c = 2;

a = b = c;

那么, a,b,c的值到底是1还是2?

如果先执行a = b的话, a的值为1, 如果先执行 b = c 的话, a的值为2.

  3 #include <stdio.h>
  4
  5 int main(int argc, char *argv[])
  6 {
  7     int a, b = 1, c = 2;
  8
  9     a = b = c;
 10
 11     printf ("a = %d\n b = %d\n c = %d\n", a, b, c);
 12
 13     return 0;
 14 }


经测试, a 的值为2.

对此,我们可以得出结论:

所有的赋值符(包括复合赋值符)都具有右结合性,就是说表达式中最右边的操作最先执行,然后从右到左依次执行。对于以上程序, 就是c先赋值给b, 然后b再赋值给a,故最终a的值为2。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值