首页 > 解决方案 > 在三元运算符中隐式转换为 void*?

问题描述

void*我知道类型化指针在传递给期望参数的函数时可以隐式转换void*,但我没想到会在三元操作中看到它(至少我认为这是正在发生的事情)。

考虑这个简化的代码:

int * dude() {
    float * f = NULL;
    int * i = NULL;
    return (0 ? f : i);  // pointer type mismatch in conditional expression (good: this is what I want)
}

i但如果我投到void*

int * dude() {
    float * f = NULL;
    int * i = NULL;
    return (0 ? f : (void*)i);  // no error!  it suddenly likes f?  or is f being optimized out?
}

我会更进一步,故意返回f

int * dude() {
    float * f = NULL;
    int * i = NULL;
    return (1 ? f : (void*)i);  // again no error... is f being converted to void*?
}

我预计第二个和第三个示例都会出错,但我没有得到一个。有人可以解释这里发生了什么吗?谢谢!

标签: cpointerslanguage-lawyerimplicit-conversionconditional-operator

解决方案


该标准明确规定,如果条件运算符的两个操作数都是指针,一个是void*(不包括空指针常量),则结果为void*. 从 C11 6.5.15/6 开始:

如果第二个和第三个操作数都是指针,或者一个是空指针常量,另一个是指针,则结果类型是指向一个类型的指针,该类型用两个操作数引用的类型的所有类型限定符限定。此外,如果两个操作数都是指向兼容类型或兼容类型的不同限定版本的指针,则结果类型是指向复合类型的适当限定版本的指针;如果一个操作数是空指针常量,则结果具有另一个操作数的类型;否则,一个操作数是指向 void 或限定版本的 void 的指针,在这种情况下,结果类型是指向适当限定版本的 void 的指针。


推荐阅读