Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
如何理解C99标准语法_C_C99_Iso - Fatal编程技术网

如何理解C99标准语法

如何理解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

我不太明白C99中的语法是什么意思。这里所说的C99是指ISO/IEC 9899:1999。嗯,我认为语法部分自ANSIC,C89以来没有太大变化

例如:

我想知道为什么在乘法运算符的语法中我们有一个“强制表达式”?这种语法意味着什么?在@Avi中,我是这么说的

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表达式本身在c99
    6.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;