Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/C++;编译器是否区分*运算符(指针、解引用运算符、乘法运算符)的用法? < C > C++语言中,编译器如何区分“代码> */CUT>”作为指针( MyClass *类< /代码>),当用作乘法运算符( A*B >)或何时为引用操作符( * MyIVAR< >?< /P> < P> >取决于使用的上下文,对于简单的解决方案,它会查看左右单词以了解符号是什么。_C++_C_Lexer_Lexical Analysis_C++ Faq - Fatal编程技术网

C/C++;编译器是否区分*运算符(指针、解引用运算符、乘法运算符)的用法? < C > C++语言中,编译器如何区分“代码> */CUT>”作为指针( MyClass *类< /代码>),当用作乘法运算符( A*B >)或何时为引用操作符( * MyIVAR< >?< /P> < P> >取决于使用的上下文,对于简单的解决方案,它会查看左右单词以了解符号是什么。

C/C++;编译器是否区分*运算符(指针、解引用运算符、乘法运算符)的用法? < C > C++语言中,编译器如何区分“代码> */CUT>”作为指针( MyClass *类< /代码>),当用作乘法运算符( A*B >)或何时为引用操作符( * MyIVAR< >?< /P> < P> >取决于使用的上下文,对于简单的解决方案,它会查看左右单词以了解符号是什么。,c++,c,lexer,lexical-analysis,c++-faq,C++,C,Lexer,Lexical Analysis,C++ Faq,语言的语法是由一个语法生成树定义的,它固有地赋予某些运算符的应用优先于其他运算符的应用。当表达式可能不明确时(例如,使用的两个运算符由同一个词法标记表示),这尤其方便 但这只是词法分析和解析。任何特定的操作是否在语义上是有效的,直到编译的后期才决定;特别是,给定两个指针x和y,表达式*x*y将无法编译,因为您不能用*x乘以y,而不是因为在一个解引用之后可能发生的另一个解引用中缺少运算符 进一步阅读维基百科页面: 其他有趣的阅读请点击此链接。 延迟*运算符是一元运算符,所以在一般情况下,编译器将应

语言的语法是由一个语法生成树定义的,它固有地赋予某些运算符的应用优先于其他运算符的应用。当表达式可能不明确时(例如,使用的两个运算符由同一个词法标记表示),这尤其方便

但这只是词法分析和解析。任何特定的操作是否在语义上是有效的,直到编译的后期才决定;特别是,给定两个指针
x
y
,表达式
*x*y
将无法编译,因为您不能用
*x
乘以
y
,而不是因为在一个解引用之后可能发生的另一个解引用中缺少运算符

进一步阅读维基百科页面:

其他有趣的阅读请点击此链接。

  • 延迟
    *
    运算符是一元运算符,所以在一般情况下,编译器将应用隐式规则。乙二醇
  • 乘法运算符
    *
    是一个二进制运算符,因此在一些简单的情况下,只要操作数支持乘法,编译器就会应用乘法,例如:
  • 对于更复杂的操作,如果运算符不够,您可能需要帮助编译器理解使用括号的含义,例如:

维基百科上有一篇关于经典方法的文章:.@user786653,至少在gcc的情况下,这不再是一件事了。C++是足够复杂的,以至于经典的词汇是无能的。G++使用一个手工编写的递归下降解析器(类似于GoogleTranslator的基础部分),而不是基于bison的解析器。但一般来说,它取决于编译器的实现,只有少数公开了编译器区分
a&b
&var
+a
a+b
,或
&&a
a&b
的相同方式:一个是一元运算符,另一个是二进制运算符。在C++/CLI中还有
type^
vs
a^b
type%
vs
a%b
没有实际的歧义需要解决。从语法上看,一元运算符还是二元运算符总是很清楚的,从当前解析上下文看,无论是编写声明还是取消引用都很清楚。因此,如果不是真的,不要这样说;-)。通常,对于函数指针,需要使用括号,因为运算符()()的优先级高于运算符*(),但这不是特定于*。特别是,为了防止去引用和乘法之间的混淆,这是不必要的;但同样,星号的不同语义之间没有混淆的危险。我认为这种混淆是不可能的,因为您不能对指针进行乘法(我敢打赌您可以在早期——ANSI之前——的C版本中使用)。
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);