一些符号的求值顺序
<<
<< 运算符没有明确规定何时以及如何对运算对象求值, 下面输出的表达式是未定义的:
int i = 0;
cout << i << "\t" << ++i << endl;
编译器不会报错, 程序也会正常执行, 但是输出结果是不可预知的. 因此不论编译器生成什么样的代码都是错误的。
函数
某表达式:f() + g() * h() +j()
符合优先级和结合律,但是函数的调用是没有明确规定的,遇过f、g、h和j是无关函数,它们既不会改变同意对象的状态也不执行IO任务,那么函数的调用顺序不受限制。反之,如果其中某几个函数影响同意对象,则它是一条错误的表达式,将产生未定义的行为。
&&
它规定先求左侧对象的值,只有当左侧对象的值为真时才继续求右侧对象的值。
||
当且仅当左侧对象为假时才对右侧运算对象求值。
逻辑与和逻辑或,都是当且进档左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这种策略称为短路求值。
?:
cond ? expr1 : expr2
cond表达式为真,仅对expr1求值;为假,仅对expr2求值。因此,expr1和expr2共有的参数来说,只会参加其中一个表达式的运算。
输出表达式中,<< 的优先级比比价运算符优先级高,cout << grade < 60 ? “fail” : “pass”;就是错误的。会先输出grade再比较cout与60。
, (逗号运算符)
1.首先对左侧的表达式求值,然后将求值结果丢弃掉。逗号运算符真正的结果是右侧表达式的值。如果右侧运算对象是左值,那么最终的求值结果也是左值。
main()
{
int a,s,d;
s=2;
d=3;
a=12+(s+2,d+4);
}
先算括号内的值:s+2=4,d+4=7;括号内应为(4,7),括号内取值只取最后一个,如果没有括号则取第一个;a=12+7=19。
2. 逗号运算符( , )是C语言运算符中优先级最低的一种运算符。
3. 在for里面的应用:
int i;int j;
for(i=0,j=0;i<7;i++,j++)
4.当分隔符:int i,j;
运算符优先级:
1、优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
2、相同优先级中,按结合顺序计算。大多数运算是从左至右计算,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。
3、基本的优先级需要记住:指针最优,单目运算优于双目运算。如正负号。先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 && 7等价于 (1 << (3 + 2))&&7.逻辑运算最后计算。
注:图片来自网络