逗号的左侧操作数无效 VS 逗号的右侧操作数无效

Left-hand operand of comma has no effect vs Right-hand operand of comma has no effect

我是 C++ 的初学者,目前正在阅读一本书以提高它的水平。在阅读有关 C++ 唯一的三元运算符的部分时,我尝试了一些代码并得到了一个问题:

所以,当我这样做时:

std::cout << "Hello ", "Mars";

我收到警告:

warning: right operand of comma operator has no effect [-Wunused-value]

当我这样做时:

std::cout << (5 > 4 ? "Hello ", "Mars" : "Bye ", "World");
  1. 对于 ?: 的第二个操作数,我得到:

    warning: left operand of comma operator has no effect [-Wunused-value]

  2. 对于 ?: 的第三个操作数,我得到:

    warning: left operand of comma operator has no effect [-Wunused-value]

所以我的问题是,为什么 ?: 的第二个操作数会收到第一个警告,而 ?: 的第三个操作数会收到第二个警告?

这是因为您使用它们的方式。如果你写

"Mars", std::cout<<"Hello ";

你会收到 "left operand has no effect" 警告。如果您已将表达式分配给变量

const char *msg = std::cout << "Hello ", "Mars";

您不会收到任何警告。执行此代码时,"Hello " 将被发送到 cout,而 msg 将指向 "Mars"。

对于三元运算符,逗号运算符的右操作数是运算符的结果,即三元运算符的表达式值。你的例子和你写的一样

std::cout << (5 > 4 ? "Mars" : "World");

据我所知,您不能像在 Python 中那样在输出流中使用逗号。 您必须在两者之间使用流媒体运营商。

所以:

std::cout << "Hello ", "Mars";

现在应该是:

std::cout << "Hello" << "Mars";

尝试在整个代码中解决这个问题,看看会发生什么。

来自cppreference

In a comma expression E1, E2, the expression E1 is evaluated, its result is discarded (although if it has class type, it won't be destroyed until the end of the containing full expression), and its side effects are completed before evaluation of the expression E2 begins (note that a user-defined operator, cannot guarantee sequencing) (until C++17).

被丢弃的是左操作数的结果。但是,如果您考虑 operator precedence,其中逗号运算符始终位于最后,那么

std::cout << "Hello ", "Mars";

相同
(std::cout << "Hello ") , ( "Mars" ) ;

并且编译器正在尝试变聪明。这个

std::cout << "Hello "

即使忽略返回值也有影响。请注意,operator<< returns 是对流的引用,您通常会忽略该值。因此,通过逗号运算符丢弃它并不会阻止它在屏幕上打印一些东西。

另一方面

"Mars";

因为语句没有效果,这就是编译器在这种情况下试图告诉的内容。