在线咨询
有事点这里
有事点这里
看不懂这篇文章?联系我们
("麦洛克菲"长期致力于内核安全的推广与普及,我们更专业!)
求职QQ群:223902435。讨论各种求职笔试面试问题
作者:admin 时间:2015-10-31
标题:运算符

1.C语言的操作符共有15个优先级,下表展示了各个操作符及其优先级和结合律:
 

2.记忆口诀:
记忆不能死记,即使通过死记记住了,那也是短期记忆,长久之后也记不住,因此需要讲究特别的技巧。下表用三句话记住所有运算符的优先级:
结合律的记忆,则可以考虑记住右结合律的运算符,这部分运算符比较少,只有4类,即:
一元运算符和三元运算符都是右结合律;赋值(=)运算符和逗号(,)运算符是右结合律,剩下的就是左结合律。
3.操作符易错处
如果不熟悉各操作符的优先级,很容易出现计算错误。一个常见的错误就是移位操作符(<<和>>) 与算术操作符之间的优先级。例如想把一个数a左移8位与另一个数b求和, 容易犯的错误就是认为移位运算符的优先级高于算术运算符,往往会写出如下的代码:
 a << 8 + b;
由于算术运算符的优先级高于移位优先级,所以实际上上面的代码等价于:
a << (8 + b);
可见上面两个表达式的运算结果其结果与下面真正想要的结果相差甚远:
 (a << 8) + b

此外,“=”与“==”操作符也非常容易混淆。尤其是在该用“==”的时候用成了“=”。例如:
if (a ==b)
    DoSomething();
该语句就会经常被错误的写成:
if (a = b)
    DoSomething();
这样,语义完全变了。本来是在a==b的条件下才执行的语句现在却变成了由b的值是否为非0决定了。
当一个变量与一个常量做“==”比较时,为了避免类似的错误,一般将常量放在左边,将变量放在右边进行比较。如:
if (NULL == p)
{
    do something;
}
或者
 if (0 == i)
{
    do something;
}
这样,当误将“==”写成“=”时,程序在编译的时候就会报错,提醒程序设计者予以改正。

4,逗号操作符

逗号操作符组成的逗号表达式: a,b,c,d 。逗号表达式是用逗号运算符将表达式连接在一起形成新的表达式。逗号表达式的格式为: 表达式1,表达式2,…,表达式n 逗号表达式的计算顺序是从左往右,逗号表达式最终的值是表达式n的值,即表达式最右边的值为逗号表达式的值。

在计算逗号表达式的值的时候,一定要注意,逗号运算符的优先级是最低的运算符,所以逗号运算符是最后参加运算的。比如考虑如下程序的输出是什么呢?
void main(void)
{
    int a,b,c;
    a=b=1;
    c=a++,b++,++b;
    printf("%d,%d,%d\n",a,b,c);


首先,由于逗号运算符的优先级最低,所以也就低于赋值运算符,所以表达式:
c=a++,b++,++b
等价于:
 (c=a++),b++,++b
等价于:
(c=a; a++),b++,++b
其结果为:
c=1, a=2, b= 3
所以输出应该是:
2,3,1。
而整个逗号表达式的值为3。
void main()
{
    int a=2,b=4,c=6,x,y,z;
    z=(y=(x=a+b),(b+c));
    printf("y=%d,x=%d,z=%d",y,x,z);
}
由于赋值运算符优先级高于逗号运算符,所以,应该先算x=a+b,即x=6,再算y=(x=6),即y也等于6,再算b+c,即10,所以z=(6,10),所以,z=10。
于是输出为:
y=6,x=6,z=10
当然,需要注意的是并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如
printf("%d %d %d",a,b,c);
func(a, b,c);