我有这样的代码:
int quotient = 100/*ptr;
其中pcr是指向整数的指针。
但它正在将/*
作为评论。
如何通过指针取消引用值来划分除法的含义?我还有什么额外的特殊性才能具备这个含义?
这是因为语言试图重用令牌。 (在这种情况下*
)
解决方案是在/
和*
之间放置一个空格来击败最大的蒙克。
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 ++使用maximal munch rule来解析令牌。令牌之后的最长有效匹配字符串将是下一个令牌。
因此,在int quotient = 100/*ptr;
,/*
将是一个单一的代币而不是两个代币/
和*
。这是规则的不良影响。
在某些情况下,“最大咀嚼”会导致不良或不直观的结果。例如,在C编程语言中,语句
x=y/*z;
(没有任何空格)可能会导致语法错误,因为/*
字符序列启动一个(非预期的)注释,该注释要么是未终结的,要么是稍后的结束标记*/
终止,无关的实际评论(C中的评论不嵌套)。在语句中实际意味着将变量x分配给y中的值除以通过解除引用指针z获得的值的结果;这将是完全有效的(虽然不是很常见)代码。可以通过使用空格或使用x=y/(*z);
来说明。
要解决此问题,您只需添加空格,新行或其他虚拟标记(如注释)即可分隔/
和*
。您也可以像其他答案一样用括号括起表达式
int quotient = 100/ /* this will work */ *ptr;
int quotient = 100/
*ptr; // this will also work
一个类似的问题:Why doesn't a+++++b
work in C?
把它改成这个:
int quotient = 100/(*ptr);
要么
int quotient = 100/ *ptr;
/*
一起被用于我所知道的几乎所有语言的多行评论。