0%

浅析C语言符号

这里所说的符号是大家不常用的,而且可能出错的符号。不仅仅是指运算符,具体有注释符号,反斜杠,自增自减操作符。

1.关于注释符号

[cce_cpp tab_size=”4”]
int//i;
y = x/*p;
[/cce_cpp]
编译器剔除注释不是简单的剔除,而是用空格代替原来的注释。所以第一个表达式是正确的。而第二个表达式则会被编译器认为p为注释的一部分。

2.反斜杠(\)
C语言里以反斜杠(\)表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动连接到前面一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。

3.++、--操作符

我们知道++、–作为前缀的时候,先自加或自减,然后再做别的运算。但看下面的例子
[cce_cpp] j = (++i) + (++i) + (++i);[/cce_cpp]
表达式的值为多少呢?
其实上式的结果是依赖于编译器的,有的编译器是先算前两个,再加上第三个。也就是i自加两次等于2,相加等于4,最后再加3,结果为7。而有的编译器是i自加3次之后再进行相加,结果也就是9。
++、–作为后缀的时候,在当前的运算结束之后,再进行自增和自减。但什么时候算作运算结束呢?下面举几个例子进行说明
[cce_cpp]
int i=1;
A. j = i++;
B. j = (i++, i++);
C. j =i + (i>0?i++:i);
D. j = (i++) + (i++) + (i++);
[/cce_cpp]
A.j=1,执行完j=i++后,i=2.
B.在逗号执行完之后,i=2,j的值为第二个i++的值,也就是j=2
C.同理 j=3
D.由于运算到分号才结束,所以j=3.

下面留一个比较有意思的问题

[cce_cpp]
for(i=0,printf("First=%d\n",i); i<10,printf("Second=%d\n",i); i++,printf("Third=%d\n",i))
{
    printf("Fourth=%d\n", i);
}
[/cce_cpp]

4.C语言运算符优先级总结
  1. 优先级最高的并非真正意义上的操作符,包括数组下标[],(),.,->
  2. 单目运算符仅次于1
  3. 双目运算符:算术运算符的优先级最高,移位运算符次之,关系运算符次之,接着是逻辑运算符,赋值运算符,最后是条件运算符。
     

参考:C陷阱与缺陷;C专家编程;C语言深度剖析