如何理解C99标准语法
我不太明白C99中的语法是什么意思。这里所说的C99是指ISO/IEC 9899:1999。嗯,我认为语法部分自ANSIC,C89以来没有太大变化 例如: 我想知道为什么在乘法运算符的语法中我们有一个“强制表达式”?这种语法意味着什么?在@Avi中,我是这么说的如何理解C99标准语法,c,c99,iso,C,C99,Iso,我不太明白C99中的语法是什么意思。这里所说的C99是指ISO/IEC 9899:1999。嗯,我认为语法部分自ANSIC,C89以来没有太大变化 例如: 我想知道为什么在乘法运算符的语法中我们有一个“强制表达式”?这种语法意味着什么?在@Avi中,我是这么说的 a*b*c “c必须被解析为强制转换表达式”,我不太明白这一点 以C996.6.1中的另一个例子,常量表达式的语法 Syntax constant-expression: conditional-expressio
a*b*c
“c必须被解析为强制转换表达式”,我不太明白这一点
以C996.6.1中的另一个例子,常量表达式的语法
Syntax
constant-expression:
conditional-expression
为什么这个条件表达式出现在这里?
有人能告诉我如何解释这些语法吗?提前谢谢大家
我想知道为什么在乘法运算符的语法中我们有一个“强制表达式”
这是上下文无关语法中用于指定具有相同优先级的运算符分组并首先指定优先级的典型设备(好的,这并不精确;语法可以表达的不仅仅是为运算符指定优先级,但是如果我们只想在CFG中表达简单的基于优先级的表达式求值,我们就这样做。)cast表达式
与乘法表达式
没有任何关系;它只是“任何不包含乘法运算或低优先级运算的表达式”
那么,这将如何工作:
1*2*3*4
在这种情况下,有以下分组可能性(仅限顶层):
1*(2*3*4)
(1*2)*(3*4)
(1*2*3)*4
*
剩下的任何内容都必须是强制转换表达式
,也就是说,必须不包含(未指定的)*
。因此,只有第三种选择是可行的a*b+c
a+b*c
它可以被解析为
(a*b)+c
a*(b+c)
强制转换表达式
不能包含(未指定的)+
(或者,如果我们检查它,我们可以从语法中计算出来)。这使得第一个选项成为唯一可能的选择
另一个表达
a*b+c
a+b*c
反过来,可以被解析为
(a+b)*c
a+(b*c)
*
左侧的乘法表达式
也不能包含(未加密的)+
(留给读者作为练习)。因此,只有第二种选择是可行的常量表达式s。因此,a=b
,a,b
,a+=b
不可能是常量表达式,而a+b
,a[b]
和a(b)
可能可以。请注意,它并不禁止,例如(a=b)
;您必须查看指定什么是常量表达式的实际子句,这限制了常量表达式的范围,而不是语法
我想知道为什么在乘法运算符的语法中我们有一个“强制表达式”
让我们从一个更简单的问题开始,并相应地简化语法。我们将定义一个语法来表示一个简单的算术表达式(1+2
,3*(4-2)
,42
,等等).由于我们希望普通数值常量成为合法表达式,因此必须定义语法,以便从根非终端表达式到简单数字有一条路径:
正确。我可以看出,如果我们只是将cast表达式
作为一些不是乘法表达式
的表达式,那么我们可以知道乘法表达式的关联性。但是,cast表达式本身在c996.5.4.1
中有语法,我们不需要确保示例表达式中的“c”是不是cast expression
?你能解释一下条件表达式的部分吗?这意味着我们可以简单地将cast expression
更改为conditional expression
?cast操作符恰好是一系列比乘法操作符优先级高一个的操作符本标准的运算符优先章节也是以同样的方式构建的。是的,这一章节相当不清楚和混乱,整个章节都与本标准中的表达式有关。@AllanRuin:“但是,强制转换表达式本身在c99 6.5.4.1中有语法,我们不需要确保示例表达式中的‘c’是强制转换表达式吗?“当然我们需要。然后我们看一下标准,看到cast expression->unitary expression
,unitary expression->postfix expression
,postfix expression->primary expression
和primary expression->identifier
(
的意思是“可以重写为”).c
是一个标识符,因此可以将其解析为强制转换表达式
。
x = a * (int) b;