【问题标题】:Operator comma in C++ ?: conditionalC ++中的运算符逗号?:条件
【发布时间】:2013-07-20 10:04:31
【问题描述】:

你能告诉我有什么问题吗?:操作员告诉错误:

 C2446: ':' : no conversion from 'int' to 'std::basic_ostream<_Elem,_Traits>'   
           c:\documents\visual studio 2005\projects\8.14\8.14\8.14.cpp  36

代码:

int _tmain(int argc, _TCHAR* argv[])
{
int B;
int A=(6,B=8);
bool c = true;
cout << endl << B;
while (B != 100)
{
cout << "qgkdf\n";
(A<B) ? (c = 100, B=100, cout << "!!!") : (A = 100);
A--;
}
_getch();
return 0;
}

【问题讨论】:

  • 我认为, 不是运算符,int A=(6,B=8); 行不正确
  • @ABFORCE 是运算符。
  • @hvd:会不会超载?
  • @ABFORCE:不幸的是,是的......
  • ? 操作符的问题是人们用它来编写类似上面的代码。

标签: c++ visual-studio comma


【解决方案1】:

条件运算符的两个操作数的类型需要相同。

(A<B) ? (c = 100, B=100, cout << "!!!") : (A = 100);

c = 100, B=100, cout &lt;&lt; "!!!"的类型是cout &lt;&lt; "!!!"的类型,也就是std::ostream

A = 100 的类型是int

这两种类型不匹配,因此出现错误。

编辑:逗号运算符返回最后一部分的值。你不能添加一个int,例如:

(A<B) ? (c = 100, B=100, (cout << "!!!"), 42) : (A = 100);
//                                      ^^^^

Live example here.

【讨论】:

  • @thomas 这也是一个解决方案。由于 OP 似乎想要混淆代码,我不知道他会喜欢哪一个 ;)
  • 你可以用这个代码代替,效果很好: if (A
【解决方案2】:

如果您要编写混淆代码,请确保您知道如何使用强制转换,因为解决方案显然是将cout &lt;&lt; "!!!" 的结果转换为int

(A<B) ? (c = 100, B=100, reinterpret_cast<int>(cout << "!!!")) : (A = 100);

【讨论】:

    【解决方案3】:

    由于没有使用返回值,因此将两边都强制转换为 void 可能更清楚。
    虽然不如使用一个很好的旧“如果”那么清楚。

    【讨论】:

      【解决方案4】:

      这是对 ?: 运算符的公然滥用。使用if 语句。这就是他们的目的。

      【讨论】:

        猜你喜欢
        • 2011-06-14
        • 2012-10-09
        • 2013-05-04
        • 2012-08-21
        • 1970-01-01
        • 2017-07-11
        • 2010-12-16
        • 1970-01-01
        • 2020-04-22
        相关资源
        最近更新 更多