通过添加一些特殊字符,使 /* 的含义用于取消引用和划分不用于注释

make the meaning of /* for dereference and dividing not for commenting by adding some special character

本文关键字:用于 取消 引用 注释 划分 添加 特殊字符      更新时间:2023-10-16

我有这样的代码:

int quotient = 100/*ptr; 

其中 PTR 是指向中间的指针。

但它以/*作为评论。
如何使除以指针取消引用值的含义?我必须加上什么额外的特殊字符才能具有这种含义?

发生这种情况是因为语言试图重用令牌。(在这种情况下*

解决方案是在/*之间留出一个空间,以击败最大的咀嚼。

int quotient = 100 / *ptr;

另一种方法是添加括号或使用另一个局部变量:

int quotient = 100/(*ptr);

首先,您可以将*ptr替换为 ptr[0] ,因为两者都具有相同的语义:

int quotient = 100/ptr[0];

由于数组索引是可交换的,因此您可以交换操作数:

int quotient = 100/0[ptr];

对于普通读者来说,这可能看起来像是除以零,但当然[]/具有更高的优先级。你可能想在那里放一个空格,以防万一:

int quotient = 100/0 [ptr];

恭喜你,你现在有了一份终身的工作!

C 和 C++ 使用最大咀嚼规则来解析令牌。令牌后最长的有效匹配字符串将是下一个令牌。

因此在int quotient = 100/*ptr;中,/*将是一个令牌,而不是两个令牌/*。这是该规则的不良影响。

在某些情况下,"最大咀嚼"会导致不良或不直观的结果。例如,在 C 编程语言中,语句 x=y/*z;(没有任何空格)可能会导致语法错误,因为/*字符序列启动一个(意外的)注释,该注释要么未终止,要么由一些稍后不相关的实际注释的结束标记*/终止(C 中的注释不嵌套)。语句中的实际含义是将 y 中的值除以通过取消引用指针 z 获得的值的结果分配给变量 x;这将是完全有效(尽管不是很常见)的代码。它可以通过使用空格或使用x=y/(*z);来表示。

https://en.wikipedia.org/wiki/Maximal_munch#Drawbacks

要解决此问题,您只需添加一个空格,新行或其他虚拟令牌(如注释)来分隔/*。您也可以像其他答案一样用括号将表达式括起来

int quotient = 100/ /* this will work */ *ptr;
int quotient = 100/
    *ptr; // this will also work

一个类似的问题:为什么a+++++b在 C 中不起作用?

将其更改为:

int quotient = 100/(*ptr); 

int quotient = 100/ *ptr;

/*一起用于我迄今为止所知道的几乎所有语言的多行注释。