逗号的左操作数无效,而逗号的右操作数无效

时间:2019-05-27 20:00:04

标签: c++ gcc-warning

我是C ++的初学者,我目前正在阅读一本书以使其变得更好。在阅读有关C ++唯一三元运算符的部分时,我玩了一些代码并遇到了一个问题:

所以,当我这样做时:

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

我收到警告:

  

警告:逗号运算符的右操作数无效[-Wunused-value]

当我这样做时:

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

    警告:逗号运算符的左操作数无效[-Wunused-value]

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

    警告:逗号运算符的左操作数无效[-Wunused-value]

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

3 个答案:

答案 0 :(得分:4)

来自cppreference

  

在逗号表达式E1,E2中,对表达式E1求值,   结果将被丢弃(尽管如果具有类类型,则不会   销毁直到包含完整表达式的末尾),其   在评估表达式E2之前完成副作用   开始(请注意,用户定义的运算符不能保证   排序)(直到C ++ 17)。

是左操作数被丢弃的结果。但是,如果考虑使用operator precedence(逗号运算符始终位于最后),则

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

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

并且编译器试图变得更聪明。

std::cout << "Hello "
即使忽略返回的值,

也会起作用。请注意,operator<<返回对该流的引用,并且您通常会忽略该值。因此,通过逗号运算符丢弃它不会阻止它在屏幕上打印某些内容。

另一方面

"Mars";

作为一条语句无效,这就是编译器在这种情况下要试图说明的内容。

答案 1 :(得分:3)

这是因为您如何使用它们。如果你写过

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

您将收到“左操作数无效”警告。如果您已将表达式分配给变量

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

您不会收到任何警告。执行此代码后,“ Hello”将发送到cout,而msg将指向“火星”。

对于三元运算符,逗号运算符的右操作数是该运算符的结果,它是三元运算符的表达式值。您的示例与您编写的示例相同

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

答案 2 :(得分:-1)

据我所知,您不能像在python中那样在输出流中使用逗号。 您必须在两者之间使用流运算符。

所以:

ScrollEvent

现在应该是:

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

尝试在整个代码中修复此问题,然后看看会发生什么。