C预处理程序是否删除“&*”的实例?

evenex_code

我在玩耍gcc并尝试了以下代码:

int A = 42;
int *B = &A;
int *C = &*B;

C == &A,正如预期的那样。但是当我尝试:

int *B = NULL;
int *C = &*B;

事实证明C == NULL,没有段错误。因此在获取地址之前&*B实际上并没有取消引用B

我的猜测是预处理器剥离出来的情况下,&**&之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的。

预处理程序是否去除了&**&,我可以从任何给定的编译器获得这种行为吗?

沙菲克·雅格慕(Shafik Yaghmour)

预处理器并没有剥离它,&*只是最终等同于指针本身,我们可以通过起草C99标准 6.5.3.2 地址和间接操作符4来看到这一点,该说:

一元*运算符表示间接。如果操作数指向一个函数,则结果为一个函数指示符;否则为0。如果它指向一个对象,则结果是一个指定该对象的左值。如果操作数的类型为“类型的指针”,则结果的类型为“ type”。如果为指针分配了无效值,则一元*运算符的行为是不确定的。87)

脚注87说:

因此,&* E等于E(即使E是空指针),[...]

3说(重点是我的):

一元&运算符产生其操作数的地址。如果操作数的类型为“类型”,则结果的类型为“类型的指针”。如果操作数是一元*运算符的结果,则不会对该运算符和&运算符求值,并且结果都好像都被省略了,除了运算符上的约束仍然适用并且结果不是左值。

更新资料

值得一提的是gccclang您可以使用-Eflag(实时查看)和Visual Studio / EP实时查看)查看预处理结果

另外,值得注意的是,正如MSalters在他的评论中所说,仅仅拥有两个标记&*不足以理解上下文,如他的示例所示:

int *p, *q ;
int foo = *p & *q ;

因此&*,在预处理阶段甚至无法删除,因为您将没有足够的信息来确定操作符&地址还是按位运算地址

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C预处理程序删除结尾的逗号

来自分类Dev

C预处理程序是否在运行?

来自分类Dev

C预处理程序是否在运行?

来自分类Dev

C ++预处理程序测试类成员是否存在

来自分类Dev

C预处理程序指令是否每次都会重新计算?

来自分类Dev

c预处理程序是否处理浮点数学常数

来自分类Dev

C预处理程序指针混乱

来自分类Dev

#define之外的C预处理程序串联

来自分类Dev

for循环中的C预处理程序串联

来自分类Dev

扩展单个C预处理程序指令

来自分类Dev

C预处理程序:及早评估宏

来自分类Dev

C ++预处理程序串联操作

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

C中的预处理程序指令

来自分类Dev

C预处理程序宏多个参数

来自分类Dev

C预处理程序的默认添加

来自分类Dev

C预处理程序指令和链接

来自分类Dev

解释C预处理程序代码

来自分类Dev

C预处理程序如何工作?

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

C预处理程序:动态#Define创建

来自分类Dev

在扩展宏之前是否处理了预处理程序指令?

来自分类Dev

您如何测试两个#define与C预处理程序是否相同

来自分类Dev

C预处理程序以确定是否在单元测试中

来自分类Dev

是否像C语言一样在fortran中有预处理程序指令?

来自分类Dev

#if预处理程序宏是否在Objective-C的幕后“运行” #ifdef?

来自分类Dev

是否有一个C预处理程序宏来获取功能参数列表?

来自分类Dev

在同一源上多次运行C预处理程序是否安全?

来自分类Dev

删除预处理程序代码时重复的符号