以下哪个版本的C ++标准(如果有)定义明确?
void foo(void) {
char *nullPtr = NULL;
&*nullPtr;
}
请注意,我在这里特别询问&*nullPtr
。我知道简单的*nullPtr
是未定义的-但这是一个单独的问题,因此当前链接的“重复”不是重复的。
请注意,我没有将结果分配给任何内容-第二行是一个简单的语句。
这个应该是一个带有明显答案的问题,但是(似乎在此类问题上经常发生)我听到很多人说答案“显然没有定义”为“明显”定义”。
相对而言,以下内容如何? foo
是否应该产生c的读数?
extern volatile char c;
void bar(void) {
volatile char *nonnullptr = &c;
&*nonnullptr;
}
(相同问题的C版本:Is &*NULL well-defined in C?)
答案 0 :(得分:9)
这是四个问题合而为一。
&*nullPtr
自C99以来在C语言中定义良好,它表示一元&
运算符:
如果操作数是一元
*
运算符的结果,则两者都不是 运算符或&
运算符都被求值,结果就像 被省略了,[...]
&*nullPtr
在C ++的所有修订版中都未正式定义(通过省略:一元&
被指定产生指向“指定对象”的指针,一元*
被指定产生尽管指向core issue 232的方向是为了使它定义得很清楚,但它还是“指向表达式所指向的对象[...]的左值”;空指针值指向无对象)。
&*nonnullptr
不会产生*nonnullptr
的易失性读取。一元&
期望一个左值操作数;对*nonnullptr
不执行左值转换(对于C)或左值到右值转换(对于C ++)。