一、表达式的概念
表达式是由一个或多个运算对象组成,运算对象之间可以通过运算符连接起来。
二、复合表达式
复合表达式是指含有两个或者多个运算符的表达式。
【注意】复合表达式进行运算的时候要注意运算符的优先级。
三、算数运算符的优先级表
算数运算符(左结合律) | ||
运算符 | 功能 | 用法 |
+ - | 一元正号 一元负号 | + expr - expr |
* / % | 乘法 除法 求余 | expr * expr expr / expr expr % expr |
+ - | 加法 减法 | expr + expr expr - expr |
四、逻辑运算符和关系运算符
逻辑运算符和 | 关系运算符 | ||
结合律 | 运算符 | 功能 | 用法 |
右 | ! | 逻辑非 | ! expr |
左 左 左 左 | < <= > >= | 小于 小于等于 大于 大于等于 | expr < expr expr <= expr expr > expr expr >= expr |
左 左 | == != | 相等 不相等 | expr == expr expr != expr |
左 | && | 逻辑与 | expr && expr |
左 | || | 逻辑或 | expr || expr |
【注意】以上的9种运算符除了逻辑与(&&)和逻辑或(||)之外都没有规定运算顺序。
逻辑与、逻辑或的运算顺序
逻辑与:当且仅当左侧运算对象为真时才对右侧运算对象求值。
逻辑或:当且仅当左侧运算对象为假时才对右侧运算对象求值。
五、赋值运算符
赋值运算符满足右结合律
赋值运算符的优先级比较低,低于关系运算符。
【注意】切勿混用赋值运算符(=)和相等运算符(==)!如果混用发生的错误是不容检查出来的。
if(i == j)
{
/*相应的操作*/
}
判断i和j是否相等,如果相等就进行相应的操作。否则不会进入if条件语句。
if(i = j)
{
/*相应的操作*/
}
这个是把j的值赋值给i,只要j的值不等于0,就可以进入if条件语句进行相应的操作。
六、递增和递减运算符
递增运算符(++)递减运算符(--),这两个运算符分别为对象进行加一,减一操作。
它们有两个版本,一个是前置版本(++i),还有一个后置版本(i--)
先来看一下这两个版本有什么区别
前置版本:
int i = 0, j;
j = ++ i; // j = 1 , i = 1;
后置版本:
int i = 0, j;
j = i++; // j = 0, i = 1;
通过以上的例子我们可以知道,
前置版本返回的是
递增(或递减)之后的值,但是
后置版本返回的是
递增(或递减)之前的值。
【注意】在相同的条件下,前置版本的效率通常高于后置版本的。因为后置版本需要将原始的值保存下来,需要一个临时变量,但是前置版本值接就是返回递增(或递减)之后的值,不需要创建一个临时变量,所以效率会高一点。
混用解引用运算符和递增运算符
来看一个例子
*p++;
【注意】后置版本的优先级高于解引用运算符,所以以上的表达式可以写成这样*(p++); 这个表达式首先将p的值加一, 然后返回p的初始值的副本作为其结果,然后*解引用的就是p未加之前的值。
七、sizeof运算符
sizeof运算符返回的是一条表达式或者一个类型名字所占的字节数。sizeof运算符满足右结合律。
八、逗号运算符
逗号运算符含有两个运算对象,按照从左向右的顺序依次求值。
【注意】逗号运算符规定了运算对象的求值顺序。
首先对左侧的表达式求值,然后将求值结果丢弃,逗号运算符的真正结果是右侧表达式的值。