c - 在三元运算符中隐式转换为 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*?
}
我预计第二个和第三个示例都会出错,但我没有得到一个。有人可以解释这里发生了什么吗?谢谢!
解决方案
该标准明确规定,如果条件运算符的两个操作数都是指针,一个是void*
(不包括空指针常量),则结果为void*
. 从 C11 6.5.15/6 开始:
如果第二个和第三个操作数都是指针,或者一个是空指针常量,另一个是指针,则结果类型是指向一个类型的指针,该类型用两个操作数引用的类型的所有类型限定符限定。此外,如果两个操作数都是指向兼容类型或兼容类型的不同限定版本的指针,则结果类型是指向复合类型的适当限定版本的指针;如果一个操作数是空指针常量,则结果具有另一个操作数的类型;否则,一个操作数是指向 void 或限定版本的 void 的指针,在这种情况下,结果类型是指向适当限定版本的 void 的指针。
推荐阅读
- elasticsearch - 弹性搜索查询不仅可以识别结果,还可以突出显示满足特定属性的项目
- scrapy - 部署到 Scrapy Cloud 时出现“错误:部署失败:b''”
- ios - UIImagePickerViewController 相机重载标签栏控制器(调用viewDidLoad)
- python - 使用 dropout (TF2.0) 时,可变批量大小不适用于 tf.keras.layers.RNN?
- visio - 雪花的 Visio 模具?
- javascript - React TypeScript 从 Click 事件中获取数据属性
- sql - 查询目标条件
- excel - 尝试使用 countif 函数删除不良数据
- c# - 当异步任务
接口需要,如何在没有编译器警告的情况下获取返回变量 - c++ - 如何在成员初始化列表中声明共享指针