三元运算符使用时的奇怪错误

时间:2013-01-21 04:32:43

标签: c++

我有以下代码:

#include <iostream>
int main() {
    int i = 3;
    do {
        (i == 3) ? (std::cout << "Is 3.\n") : ++i;
        ++i;

    } while ( i < 4 );
    return 0;
}

并在回复中收到以下错误:

ternary.cc: In function ‘int main()’:
ternary.cc:5:43: error: invalid conversion from ‘void*’ to ‘int’ [-fpermissive]

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:5)

你滥用三元运算符,对于任何给定的a ? b : c我希望结果存储在某处,我不建议b或{ {1}}有副作用。

问题的根源在于三元运算符要求cb为相同/等效类型。安德鲁的解释是他们需要能够“解析为同一类型......”可能更准确。

对于它的价值,你可以使用手法(甚至更多的滥用,取决于你的观点)to make the code work

c

或者,more explicitly,确保两者的类型相同:

#include <iostream>
int main() {
    int i = 3;
    do {
        (i == 3) ? (std::cout << "Is 3.\n", 0) : ++i;
        ++i;

    } while ( i < 4 );
    return 0;
}

答案 1 :(得分:4)

三元运算符要求两个备选方案解析为相同的数据类型。你不能以你的方式使用它。

编译器告诉你两种类型不同 - 它不能从void*(第一条路径的类型)转换为int(第二条路径的类型)。