通过添加一些特殊字符来表示/ *用于取消引用和分割而不用于注释

问题描述 投票:12回答:4

我有这样的代码:

int quotient = 100/*ptr; 

其中pcr是指向整数的指针。

但它正在将/*作为评论。 如何通过指针取消引用值来划分除法的含义?我还有什么额外的特殊性才能具备这个含义?

c++ c
4个回答
33
投票

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

解决方案是在/*之间放置一个空格来击败最大的蒙克。

int quotient = 100 / *ptr;

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

int quotient = 100/(*ptr);

25
投票

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

int quotient = 100/ptr[0];

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

int quotient = 100/0[ptr];

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

int quotient = 100/0 [ptr];

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


13
投票

C和C ++使用maximal munch rule来解析令牌。令牌之后的最长有效匹配字符串将是下一个令牌。

因此,在int quotient = 100/*ptr;/*将是一个单一的代币而不是两个代币/*。这是规则的不良影响。

在某些情况下,“最大咀嚼”会导致不良或不直观的结果。例如,在C编程语言中,语句x=y/*z;(没有任何空格)可能会导致语法错误,因为/*字符序列启动一个(非预期的)注释,该注释要么是未终结的,要么是稍后的结束标记*/终止,无关的实际评论(C中的评论不嵌套)。在语句中实际意味着将变量x分配给y中的值除以通过解除引用指针z获得的值的结果;这将是完全有效的(虽然不是很常见)代码。可以通过使用空格或使用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

一个类似的问题:Why doesn't a+++++b work in C?


13
投票

把它改成这个:

int quotient = 100/(*ptr); 

要么

int quotient = 100/ *ptr;

/*一起被用于我所知道的几乎所有语言的多行评论。

© www.soinside.com 2019 - 2024. All rights reserved.