三元运算符中的 Cout String 和 int

Posted

技术标签:

【中文标题】三元运算符中的 Cout String 和 int【英文标题】:Cout String and int in ternary operator 【发布时间】: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 语句有什么问题? 【参考方案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);

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

【讨论】:

以上是关于三元运算符中的 Cout String 和 int的主要内容,如果未能解决你的问题,请参考以下文章

Java中三元运算符中的char转换,打印int值而不是char值

从三元运算符返回 lambda [重复]

C#中的三元运算符

C ++中的三元运算符奇怪的行为

C++中关于string类型究竟能不能用cout输出的问题

Java培训_三元运算符最终结果的数据类型