在C和C++语言中,编译器如何区分
*
在用作指针时(MyClass* class
)和用作乘法运算符时(a * b
),或者在解引用操作符时(*my_var
)?*
在用作指针时(MyClass* class
)和用作乘法运算符时(a * b
),或者在解引用操作符时(*my_var
)?它的含义取决于使用的上下文,对于简单的解析,它会查看左右单词以了解符号的含义。
编程语言的语法由一棵语法产生树定义,其天然地将某些运算符的应用优先级或“优先级”融入其中,这在表达式可能模棱两可时特别有用(比如说两个使用相同词汇标记的运算符)。
但这仅仅是词法分析和语法分析。任何特定操作是否实际上具有语义有效性要到后面进行编译才能确定;特别地,对于给定的两个指针 x
和 y
,表达式*x *y
将无法编译,因为你不能将*x
乘以y
,而不是因为在可能是一个解引用后跟另一个解引用的情况下缺少运算符。
更多阅读请参考维基百科页面:Lexer_hack。
此外,还可以在这个Enacademic链接中了解其他有趣的内容。
*
操作符是一元操作符,所以在简单情况下编译器会应用隐式规则。例如int a;
int *ptr = &a;
*ptr = 5;
*
是一个二元运算符,因此在简单的情况下,编译器会应用乘法,前提是操作数支持它,例如:int a;
int b;
int c = a*b;
int a = 1;
int b[2] = {2,3};
int *aPtr = &a;
int *bPtr = b;
int c = *aPtr * *(bPtr+1);
a & b
和&var
、+a
和a + b
、&&a
和a && b
的方式相同:一个是一元运算符,另一个是二元运算符。在C++/CLI中也有type ^
与a ^ b
及type %
与a % b
。 - phuclv