三元运算符中的 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<<
被重载,两个执行路径不使用相同的重载。因此,你不能在条件之外有<<
。
你想要的是
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的主要内容,如果未能解决你的问题,请参考以下文章