繁体   English   中英

在三元运算符中隐式转换为 void*?

[英]Implicit cast to void* in ternary operator?

我知道当传递给 function 期望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?
}

我将 go 更进一步并有意返回f

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM