首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/C++编译器如何区分*操作符(指针、取消引用操作符、乘法运算符)的用法?

C/C++编译器如何区分*操作符(指针、取消引用操作符、乘法运算符)的用法?
EN

Stack Overflow用户
提问于 2020-10-08 07:28:22
回答 2查看 1K关注 0票数 10

在C语言和C++语言中,编译器在用作指针(MyClass* class)和作为乘法运算符(a * b)时,或者什么时候是取消引用操作符(*my_var)时,如何区分*

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-08 07:34:38

它取决于使用它的上下文,对于一个简单的解析,它看左和右的单词来理解符号是什么。

语言的语法是由一棵语法成果树来定义的,它内在地赋予某些运算符的应用优先或“优先”于其他运算符的应用。当表达式可能不明确时(例如,使用的两个运算符由相同的词法标记表示),这是特别方便的。

但这只是词法和解析。任何特定操作是否真正在语义上是有效的,要到编译的后期才能确定;特别是,给定两个指针xy,表达式*x *y将无法编译,因为您不能将*x乘以y,而不是因为在否则可能是取消引用和另一个取消引用的过程中缺少了一个操作符。

进一步阅读维基百科网页:黑客攻击

其他有趣的阅读在这个莱克-哈克学术链接。

票数 19
EN

Stack Overflow用户

发布于 2020-10-08 07:42:13

  • 延迟*操作符是一个一元操作符,所以在一些简单的情况下,编译器将应用一个隐式规则。例如
代码语言:javascript
复制
int a;
int *ptr = &a;
*ptr = 5;
  • 乘法运算符*是一个二进制运算符,所以在一些简单的情况下,编译器将应用乘法,只要操作数支持它,例如:
代码语言:javascript
复制
int a;
int b;
int c = a*b;
  • 对于更复杂的操作,如果操作符优先不够,您可能需要通过使用括号来帮助编译器理解您的意思:
代码语言:javascript
复制
  int a = 1;
  int b[2] = {2,3};
  int *aPtr = &a;
  int *bPtr = b;
  
  int c = *aPtr * *(bPtr+1);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64257714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档