关于括号、布尔逻辑和 '\n'
About parentheses, boolean logic, and '\n'
我发现 (true && false) 给出 0,而 true && false(没有括号) 给出 1。
这个问题可能很愚蠢,因为我刚开始学习 C++,但我在任何地方都找不到答案。
我运行以下:
cout << (true && false) << '\n';
cout << true && false << '\n';
cout << (true && false == true);
它给了我:
0
10
看到这里,我更懵了:
(true && false)
和 true && false
(不带括号)有什么区别?
- 因为
true && false
给了我1
,所以我认为没有括号的true && false
是true
。但是,(true && false == true)
给了我 0
。为什么?是不是因为0
和1
不一定代表false
和true
?
- 另外,第二行的
'\n'
似乎不起作用。为什么?
cout << true && false << '\n';
与
相同
(cout << true) && (false << '\n');
true
(1) 流式传输到 cout
,返回对流的引用。
&&
false
(0) 左移 \n
(10) 位,结果为 0。
流现在处于布尔上下文中(因为 &&
)并且将通过其转换运算符 operator bool ()
true
因为它仍然处于良好状态。
我们剩下 true && 0
,结果是 false
。
(cout << true) && (false << '\n') ==
(cout << true) && (false << 10) == // right side: 0 << 10
(cout << true) && 0 => // true is sent out here
bool(cout) && 0 =>
true && 0
false
如 table of operator precedence 所示,<<
的优先级为 7,&&
的优先级为 14
因此,表达式 cout << true && false << '\n';
可以 re-written 为:
(cout << true) && (false << '\n');
计算结果为:
(cout << true) // Output: "1"; Evaluates to an ostream-object.
(false << '\n') // No output; Evaluates to 0, the '\n' "disappears"
[ostream-object] && 0; // No output; Evaluates to 0
&&
的优先级低于 <<
和 ==
,因此代码表现为:
cout << (true && false) << '\n';
(cout << true) && (false << '\n');
cout << (true && (false == true));
在第一行,你在判断真假。
在第二行中,您流式传输 true,并将 false 左移换行符的 ascii 值(无效)。
在第三行中,您正在测试 false 是否等于 true,这会产生 false。
我发现 (true && false) 给出 0,而 true && false(没有括号) 给出 1。 这个问题可能很愚蠢,因为我刚开始学习 C++,但我在任何地方都找不到答案。
我运行以下:
cout << (true && false) << '\n';
cout << true && false << '\n';
cout << (true && false == true);
它给了我:
0 10
看到这里,我更懵了:
(true && false)
和true && false
(不带括号)有什么区别?- 因为
true && false
给了我1
,所以我认为没有括号的true && false
是true
。但是,(true && false == true)
给了我0
。为什么?是不是因为0
和1
不一定代表false
和true
? - 另外,第二行的
'\n'
似乎不起作用。为什么?
cout << true && false << '\n';
与
相同
(cout << true) && (false << '\n');
true
(1) 流式传输到 cout
,返回对流的引用。
&&
false
(0) 左移 \n
(10) 位,结果为 0。
流现在处于布尔上下文中(因为 &&
)并且将通过其转换运算符 operator bool ()
true
因为它仍然处于良好状态。
我们剩下 true && 0
,结果是 false
。
(cout << true) && (false << '\n') ==
(cout << true) && (false << 10) == // right side: 0 << 10
(cout << true) && 0 => // true is sent out here
bool(cout) && 0 =>
true && 0
false
如 table of operator precedence 所示,<<
的优先级为 7,&&
的优先级为 14
因此,表达式 cout << true && false << '\n';
可以 re-written 为:
(cout << true) && (false << '\n');
计算结果为:
(cout << true) // Output: "1"; Evaluates to an ostream-object.
(false << '\n') // No output; Evaluates to 0, the '\n' "disappears"
[ostream-object] && 0; // No output; Evaluates to 0
&&
的优先级低于 <<
和 ==
,因此代码表现为:
cout << (true && false) << '\n';
(cout << true) && (false << '\n');
cout << (true && (false == true));
在第一行,你在判断真假。 在第二行中,您流式传输 true,并将 false 左移换行符的 ascii 值(无效)。 在第三行中,您正在测试 false 是否等于 true,这会产生 false。