问题描述
在C/C++
语言中,编译器如何区分何时将*
用作指针(MyClass* class
),何时将其用作乘法运算符(a * b
)或何时是取消引用运算符(*my_var
)?
解决方法
它取决于使用它的上下文,为了简单解决,它会查看左右单词以了解符号是什么。
该语言的语法由一棵语法生成树定义,这些树固有地赋予某些操作符应用程序其他应用程序以优先权或“优先权”。这在表达式可能不明确的情况下特别方便(因为,例如,使用的两个运算符由相同的词法标记表示)。
但这只是词法分析。直到以后的编译过程中,才能确定任何特定操作在语义上是否有效。特别是,给定两个指针x
和y
,表达式*x *y
将无法编译,因为您不能将*x
与y
相乘,不是因为缺少运算符,否则本来可能是先解除引用,然后再进行另一次解除引用。
进一步阅读维基百科页面:Lexer_hack。
通过此Lexer-Hack Enacademic链接获得其他有趣的阅读内容。
,- 推迟
*
运算符是一元运算符,因此在平凡的情况下,编译器将应用隐式规则。例如
int a;
int *ptr = &a;
*ptr = 5;
- 乘法运算符
*
是二进制运算符,因此在平凡的情况下,只要操作数支持乘法运算,编译器就会应用乘法运算,例如:
int a;
int b;
int c = a*b;
- 对于更复杂的操作,如果运算符precedence不够,则可能需要使用括号来帮助编译器理解含义,例如:
int a = 1;
int b[2] = {2,3};
int *aPtr = &a;
int *bPtr = b;
int c = *aPtr * *(bPtr+1);