C / C ++编译器如何区分*运算符指针,解引用运算符,乘法运算符的用法?

问题描述

C/C++语言中,编译器如何区分何时将*用作指针(MyClass* class),何时将其用作乘法运算符(a * b)或何时是取消引用运算符(*my_var)?

解决方法

它取决于使用它的上下文,为了简单解决,它会查看左右单词以了解符号是什么。

该语言的语法由一棵语法生成树定义,这些树固有地赋予某些操作符应用程序其他应用程序以优先权或“优先权”。这在表达式可能不明确的情况下特别方便(因为,例如,使用的两个运算符由相同的词法标记表示)。

但这只是词法分析。直到以后的编译过程中,才能确定任何特定操作在语义上是否有效。特别是,给定两个指针xy,表达式*x *y将无法编译,因为您不能将*xy相乘,不是因为缺少运算符,否则本来可能是先解除引用,然后再进行另一次解除引用。

进一步阅读维基百科页面: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);