通过添加一些特殊字符,使 /* 的含义用于取消引用和划分不用于注释
make the meaning of /* for dereference and dividing not for commenting by adding some special character
我有这样的代码:
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;
/*
一起用于我迄今为止所知道的几乎所有语言的多行注释。
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 挂起和取消挂起一个文件DLL
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 如何取消对nullptr的屏蔽,返回正确的对象
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- C++取消引用指针.为什么会发生变化
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 取消排队不适用于从双链表继承的队列类
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- 取消引用适用于 ptr->运算符*(),但不适用于 *ptr
- 编译三个文件以创建一个用于平均值的程序(取消注释?)
- 通过添加一些特殊字符,使 /* 的含义用于取消引用和划分不用于注释
- Pthread_cond_timedwait()用于取消长时间任务