关于括号、布尔逻辑和 '\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

看到这里,我更懵了:

  1. (true && false)true && false(不带括号)有什么区别?
  2. 因为true && false给了我1,所以我认为没有括号的true && falsetrue。但是,(true && false == true) 给了我 0。为什么?是不是因为01不一定代表falsetrue
  3. 另外,第二行的'\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。