【发布时间】:2016-05-28 20:32:17
【问题描述】:
有多种类型转换可以确保赋值工作,例如隐式类型转换(提升)和显式类型转换(截断),但我不确定它如何在三元运算符的指针类型转换上工作。
#include <stdlib.h>
int main (void)
{
(void)((rand() ? (char*)NULL : NULL) + 1);
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -> expression A */
/* GCC Warning: pointer of type ‘void *’ used in arithmetic */
(void)((rand() ? (char*)NULL : (void*)NULL) + 1);
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -> expression B */
return 0;
}
显然,编译器将表达式 A 视为 char* 的类型,而将 B 视为 void* 的类型。
我有两个问题:
我检查了预处理后的代码,
NULL正好扩展为((void*)0),那为什么((void*)0)和(void*)((void*)0)是不同的类型呢?根据表达式B,为什么编译器将
char*的类型转换为void*的类型,反之则不行?
【问题讨论】:
-
在我看来,一个好的答案需要一个标准参考,但这里发生的是在第一种情况下将 NULL 隐式转换为 (char*)NULL,以及 (char*) 的隐式转换)NULL 到 (void*)NULL 在第二种情况下。不错的问题,再加上一个。
标签: c pointers casting null ternary-operator