SELECT -100/-100*10结果是0.SELECT (-100/-100)*10结果是10.SELECT -100/(-100*10)结果是0.SELECT 100/100*10结果是10.BOL声明:
当表达式中的两个运算符具有相同的运算符优先级时,它们将根据它们在表达式中的位置从左到右进行计算.
和
Level Operators
1 ~ (Bitwise NOT)
2 * (Multiplication), / (Division), % (Modulus)
3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR)
Run Code Online (Sandbox Code Playgroud)
BOL是错的,还是我错过了什么?似乎-正在抛弃(预期)优先权.
术语"运算符优先级"和"评估顺序"是编程中非常常用的术语,对于程序员来说非常重要.而且,据我所知,这两个概念紧密相连; 在谈论表达时,一个人离不开另一个人.
我们举一个简单的例子:
int a=1; // Line 1
a = a++ + ++a; // Line 2
printf("%d",a); // Line 3
Run Code Online (Sandbox Code Playgroud)
现在,很明显会Line 2导致未定义的行为,因为C和C++中的序列点包括:
在评估&&(逻辑AND)的左右操作数之间,|| (逻辑OR)和逗号运算符.例如,在表达式中
*p++ != 0 && *q++ != 0,子表达式的所有副作用*p++ != 0都在任何访问尝试之前完成q.在评估三元"问号"运算符的第一个操作数和第二个或第三个操作数之间.例如,在表达式中,在第
a = (*p++) ? (*p++) : 0一个之后存在一个序列点*p++,这意味着它已经在第二个实例执行时增加了.在完整表达结束时.此类别包括表达式语句(例如赋值
a=b;),return语句,if,switch,while或do-while语句的控制表达式,以及for语句中的所有三个表达式.在函数调用中输入函数之前.未指定参数的计算顺序,但此序列点表示在输入函数之前所有副作用都已完成.在表达式中
f(i++) + g(j++) + h(k++),f使用原始值的参数调用i,但i在进入正文之前递增f.同样,j和k正在进入前更新g和h分别.然而,不指定以何种顺序f() …