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

InQ*_*ive 12 c c++

我有这样的代码:

int quotient = 100/*ptr; 
Run Code Online (Sandbox Code Playgroud)

其中ptr是指向整数的指针.

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

Moh*_*ain 33

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

解决方案是在两者之间放置一个空格/,*以便击败最大的蒙克.

int quotient = 100 / *ptr;
Run Code Online (Sandbox Code Playgroud)

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

int quotient = 100/(*ptr);
Run Code Online (Sandbox Code Playgroud)


fre*_*low 25

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

int quotient = 100/ptr[0];
Run Code Online (Sandbox Code Playgroud)

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

int quotient = 100/0[ptr];
Run Code Online (Sandbox Code Playgroud)

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

int quotient = 100/0 [ptr];
Run Code Online (Sandbox Code Playgroud)

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

  • `[`和`]`对于某些人来说可能很难维护,所以我建议改用`<:`和`:>`. (17认同)

Sad*_*que 13

把它改成这个:

int quotient = 100/(*ptr); 
Run Code Online (Sandbox Code Playgroud)

要么

int quotient = 100/ *ptr;
Run Code Online (Sandbox Code Playgroud)

/* 在我所知道的几乎所有语言中,它一起用于多行注释.


phu*_*clv 13

C和C++使用最大munch规则来解析标记.令牌之后的最长有效匹配字符串将是下一个令牌.

因此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
Run Code Online (Sandbox Code Playgroud)

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