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

标签 c++ ternary-operator

通用原型(prototype): exp1?exp2:exp3

三元运算符的返回类型为 exp2。 exp3 必须具有与 exp2 相同的返回类型或至少具有隐式转换。否则会报错

在下面的程序中,由于 exp3 是 int 而 exp2 是 char*,我在 CodeBlocks 中收到了预期的错误。但是当我用 0 替换 1 时,它正在打印 0..

0 也是一个 int 值。我无法理解。

 #include <iostream>
   using namespace std;

   int main()
   {
   int test = 0;
   cout << test ? "A String" : 1;

   return 0;
   }

最佳答案

三元运算符的优先级相当低。唯一具有较低优先级的运算符是逗号运算符。因此,您的表达式被解释为

(std::cout << test) ? "A String": 1;

这可能不是您想要的。但是,您的问题实际上是关于两个表达式之间的区别:

  1. 表达式

    expr? "A String": 1
    

    不起作用,因为字符串文字(即 char const(&)[9] 类型)和整数文字(即 int 类型)之间没有通用类型.

  2. 表达式

    expr? "A String": 0
    

    之所以有效,是因为 0 可以被认为是一个指针常量,而字符串文字会愉快地退化为 char const*

值得注意的是,Chris Culter指出,根据 27.7.3.6.4 [ostream.inserter.character] 第 3 段,将空指针与输出运算符一起使用是未定义的行为:

template<class traits>
    basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out,
                                          const char* s);

[...]

Requires: s shall not be a null pointer.

关于c++ - C++ 奇怪行为中的三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26772806/

相关文章:

c++ - 如何在结构中的指针上使用 cudaMalloc?

c++ - 如何在 header 和 .cpp 文件中正确声明返回自己定义类型的函数?

java - 三元运算符在条件不满足时评估条件语句

c++ - 在存在通用构造函数的情况下,三元运算符上的 SFINAE 失败

c++ - 我在哪里可以找到 graphviz 的 graph.dll?

c++ - 如何将对象类数据存储在数据库类数组中

C++ 我怎样才能改进这个模板元程序来返回包含大小的数组?

javascript - 在 JavaScript 中将 switch 语句转换为三元语句

php - 如何将三元运算符存储到 laravel Blade 中的 html 元素中

Java语句: Obfuscated code - `?:`