【发布时间】:2021-05-31 00:38:03
【问题描述】:
我知道类型化指针在传递给期望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*?
}
我预计第二个和第三个示例都会出错,但我没有得到。有人可以解释这里发生了什么吗?谢谢!
【问题讨论】:
-
标记了 C++,但答案可能仍然与非类类型相关:C++ : Ternary Operator (Conditional Operator) and its Implicit Type Conversion Rules
-
术语挑剔:有隐式 conversions 但没有隐式 casts。根据定义,强制转换是涉及类型转换运算符的操作。
-
@underscore_d 在您的链接中接受的答案诱人地表示“执行指针转换以将它们转换为通用类型”......太糟糕了,它没有更详细地介绍(当, 选择什么常用类型等)
-
啊,是的,@JohnBollinger,好收获
-
避免
?:的众多原因中的另一个,除非您有非常特殊的要求。
标签: c pointers language-lawyer implicit-conversion conditional-operator