0

我有以下代码:

#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]

我的代码有什么问题?

4

2 回答 2

5

你有点滥用三元运算符,因为任何给定a ? b : c的我都希望结果存储在某个地方,我不会推荐bc有副作用。

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

对于它的价值,您可以使用花招(甚至更多滥用,取决于您的观点)来使代码工作

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

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

或者,更明确地说,确保两者都是同一类型:

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

    } while ( i < 4 );
    return 0;
}
于 2013-01-21T04:37:41.697 回答
4

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

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

于 2013-01-21T04:39:41.410 回答