#include
using namespace std;
int main(void)
{
int a = 0;
int b = 0;
int c = 0;
bool bb = (cout << "a = " << a << endl, a) ||
(cout << "b = " << b << endl, b) &&
(cout << "c = " << c << endl, c);
cout << "bb = " << bb << endl;
return 0;
}
C++ 的代码稍微一看就明白了,在小括号里面可以用逗号表达式来打印运算顺序
默认 A || B && C 时:
A = false,B = false,C 任意 顺序为:A B,bb = false
A = false,B = true,C = false 顺序为:A B C,bb = false
A = false,B = true,C = true 顺序为:A B C,bb = true
A = true, B、C 任意 顺序为:A,bb = true
添加上小括号修改顺序为 A || ( B && C ) 时:
A = false,B = false,C 任意 顺序为:A B,bb = false
A = false,B = true,C = false 顺序为:A B C,bb = false
A = false,B = true,C = true 顺序为:A B C,bb = true
A = true, B、C 任意 顺序为:A,bb = true
添加上小括号修改顺序为 (A || B ) && C 时:
A = false,B = false,C 任意 顺序为:A B,bb = false
A = false,B = true,C = false 顺序为:A B C,bb = false
A = false,B = true,C = true 顺序为:A B C,bb = true
A = true, B 任意,C = false 顺序为:A C,bb = false
A = true, B 任意,C = true 顺序为:A C,bb = true
编译器在处理表达式的时候要先从左向右读取一边做词义和语义分析,
分析之后就已经做好了逻辑运算的短路处理。
不难看出 A || B && C 与 A || ( B && C ) 结果一样,说明什么,就不言而喻了
更新
至于 || 与 && 谁先计算,这个问题就像 1 + 2 * 3 一样,1 永远比 (2 * 3) 先放入累加器
这并不影响 * 比 + 的优先级高。
1 + 2 * 3 等价于 1 + (2 * 3)
A || B && C 同样等价于 A || (B && C)
以上结果来自 linux 3.6, gcc 4.7
如果要在 java 里面做此类操作的话,只需要把 中间那部分代码贴到 main 里面,然后修改就可以得出同样的结论喽
int a = 0;
int b = 0;
int c = 0;
boolean bb = (System.out.println("a = " + a), a) ||
(System.out.println("b = " + b), b) &&
(System.out.println("c = " + c), c);
System.out.println("bb = " + bb);
祝好,
斑驳敬上