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;
这又是表示什么意思呢?
来看一下下面的测试程序:
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。