【问题标题】:Left-hand operand of comma has no effect vs Right-hand operand of comma has no effect逗号的左操作数无效 vs 逗号的右操作数无效
【发布时间】:2019-05-27 20:00:03
【问题描述】:

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

所以,当我这样做时:

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

我收到警告:

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

当我这样做时:

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

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

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

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

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

【问题讨论】:

    标签: c++ gcc-warning


    【解决方案1】:

    来自cppreference

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

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

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

    一样
    (std::cout << "Hello ") , ( "Mars" ) ;
    

    并且编译器正试图变得聪明。这个

    std::cout << "Hello "
    

    即使忽略返回值也会产生影响。请注意,operator&lt;&lt; 返回对流的引用,您通常会忽略该值。因此,通过逗号运算符丢弃它并不会阻止它在屏幕上打印某些内容。

    另一方面

    "Mars";
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      您不会收到任何警告。当这段代码被执行时,“Hello”将被发送到cout,而msg将指向“Mars”。

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

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

      【讨论】:

        【解决方案3】:

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

        所以:

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

        现在应该是:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-06
          • 1970-01-01
          • 1970-01-01
          • 2016-09-24
          • 1970-01-01
          相关资源
          最近更新 更多