我是C ++的初学者,我目前正在阅读一本书以使其变得更好。在阅读有关C ++唯一三元运算符的部分时,我玩了一些代码并遇到了一个问题:
所以,当我这样做时:
std::cout << "Hello ", "Mars";
我收到警告:
警告:逗号运算符的右操作数无效[-Wunused-value]
当我这样做时:
std::cout << (5 > 4 ? "Hello ", "Mars" : "Bye ", "World");
?:
的第二个操作数,我得到:
警告:逗号运算符的左操作数无效[-Wunused-value]
?:
的第三个操作数,我得到:
警告:逗号运算符的左操作数无效[-Wunused-value]
所以我的问题是,为什么我得到?:
的第二个操作数的第一个警告,而我却得到?:
的第三个操作数的第二个警告?
答案 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";
尝试在整个代码中修复此问题,然后看看会发生什么。