【问题标题】:Cout String and int in ternary operator三元运算符中的 Cout String 和 int
【发布时间】:2013-02-01 15:41:38
【问题描述】:

我的c++ 代码中的一行内容如下:

cout<<(i%3==0 ? "Hello\n" : i) ;//where `i` is an integer.

但我收到此错误:

operands to ?: have different types 'const char*' and 'int

如何修改代码(最少字符)?

【问题讨论】:

  • 使用标准的if-else 语句有什么问题?

标签: c++ string int


【解决方案1】:

丑陋的:

i%3==0 ? cout<< "Hello\n" : cout<<i;

不错:

if ( i%3 == 0 )
   cout << "Hello\n";
else
   cout << i;

您的版本不起作用,因为: 两边的表达式的结果类型需要兼容。

【讨论】:

  • 您的“更准确”根本不准确——第二个操作数的类型可以转换为第三个操作数的类型是完全合法的。 (“left”和“right”对于三元运算符不是很有用)
  • @BenVoigt hm,我一直认为第三个必须可以转换为第二个。
  • " 判断第二个操作数是否可以转换为匹配第三个操作数,以及第三个操作数是否可以转换为匹配第二个操作数。如果两者都可以转换,或者可以转换一个但转换不明确,程序格式错误。如果两者都不能转换,则操作数保持不变,并按如下所述执行进一步检查。如果恰好可以进行一次转换,则将该转换应用于所选操作数,并且在本节的其余部分中,使用转换后的操作数代替原始操作数。” 5.16p3
【解决方案2】:

如果两个备选方案的类型不兼容,则不能使用条件运算符。最清楚的就是使用if

if (i%3 == 0)
    cout << "Hello\n";
else
    cout << i;

虽然在这种情况下您可以将数字转换为字符串:

cout << (i%3 == 0 ? "Hello\n" : std::to_string(i));

一般来说,您应该尽量提高清晰度,而不是尽量减少字符;以后你必须阅读代码时,你会感谢自己。

【讨论】:

    【解决方案3】:

    operator&lt;&lt; 被重载,两个执行路径不使用相同的重载。因此,你不能在条件之外有&lt;&lt;

    你想要的是

    if (i%3 == 0) cout << "Hello\n"; else cout << i;
    

    这可以通过反转条件来缩短一点:

    if (i%3) cout << i; else cout << "Hello\n";
    

    还有一些使用三进制保存的字符:

    (i%3)?(cout<<i):(cout<<"Hello\n");
    

    【讨论】:

    • 是的,你是对的。但这就是原因吗? i%3==0 ? "Hello\n" : i; 不合法吗?
    • @Luchian:这是非法的,但我要进一步指出,他不想要合法的变体,他确实需要两个分支中的两个不同的函数调用。
    【解决方案4】:
    std::cout << i % 3 == 0 ? "Hello" : std::to_string(i);
    

    但是,正如所有其他答案所说,您可能不应该这样做,因为它很快就会变成意大利面条代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 2018-08-18
      • 2020-08-21
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      相关资源
      最近更新 更多