C 如何理解条件表达式、赋值表达式和常量表达式的语法?

C 如何理解条件表达式、赋值表达式和常量表达式的语法?,c,C,从C11标准 6.5.15条件运算符 语法 conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression assignment-expression: conditional-expression unary-expression assignment-operator assignment-expressi

从C11标准

  • 6.5.15条件运算符

    语法

    conditional-expression:
        logical-OR-expression
        logical-OR-expression ? expression : conditional-expression
    
    assignment-expression:
        conditional-expression
        unary-expression  assignment-operator  assignment-expression
    
    constant-expression:    
        conditional-expression
    
    逻辑表达式或条件表达式,因为它是 条件表达式的退化

  • 6.5.16赋值运算符

    语法

    conditional-expression:
        logical-OR-expression
        logical-OR-expression ? expression : conditional-expression
    
    assignment-expression:
        conditional-expression
        unary-expression  assignment-operator  assignment-expression
    
    constant-expression:    
        conditional-expression
    
    这是否意味着条件表达式是赋值 表情?为什么

  • 6.6常量表达式

    语法

    conditional-expression:
        logical-OR-expression
        logical-OR-expression ? expression : conditional-expression
    
    assignment-expression:
        conditional-expression
        unary-expression  assignment-operator  assignment-expression
    
    constant-expression:    
        conditional-expression
    
    常量表达式的语法是否表示该常量 表达式和常量表达式是同一个概念吗


  • 谢谢。

    条件表达式
    赋值表达式
    常量表达式
    在语法中是非终结符。它们的名称不应被视为暗示
    条件表达式
    必须实际涉及条件运算符,或者
    赋值表达式
    必须涉及赋值;它们是根据它们在优先级层次结构中的位置命名的


    特别是,
    常量表达式
    扩展为
    条件表达式
    ,因为常量性不是一个语法概念。语法的工作不是排除需要常量的非常量;该作业在编译器的其他部分中处理。语法将允许任何需要常量的
    条件表达式。

    第6.5章写得很糟糕,很难理解。关键是:

    C116.5/3

    运算符和操作数的分组由语法指示

    这意味着在标准的任何地方都没有明确指定运算符优先级!相反,我们应该查看每个运算符的语法并找出它

    所有运算符都建立了一个运算符优先级链,因此对于6.5的每个子章节,前面提到的运算符组只是为了表明它具有更高的优先级

    从顶部开始,我们有优先级最高的
    主表达式
    (6.5.1)。在下一组后缀运算符中,将提到前一组,以表明其具有更高的优先级:

    postfix-expression:
      primary-expression
      postfix-expression [ expression ]
      ...
    
    这并不意味着主表达式是后缀表达式,而是后缀表达式的语法是
    primary expression postfix expression…

    整个第6.5章都是这样的。这听起来可能非常愚蠢,那只是因为它非常愚蠢

    注85)试图提供一些帮助:

    语法指定表达式求值时运算符的优先级,这是相同的 作为本款主要子条款的顺序,最高优先级优先


    从本质上讲,语法非终结符的meow表达式既包括实际的meow表达式,也包括顶级运算符优先级高于meow的每个表达式(事实上,这就是标准中运算符优先级的指定方式);它们大多是按照这些思路构建的。例如,主表达式不遵循此布局,但下一个后缀表达式遵循此布局:
    后缀表达式:
    -
    主表达式
    -
    后缀表达式[表达式]
    -
    后缀表达式(参数表达式listopt)
    …后缀表达式可以是主表达式,也可以是一系列可能的后缀表达式之一。但常量表达式最好是常量。该非终结符仅用于需要实际常量表达式的地方。谢谢。(1) “它们是根据它们在优先层次结构中的位置命名的。”在非终结符的语法中,第二行始终是另一个非终结符,其优先顺序正好在非终结符之前,第三行及以下是非终结符的定义,这对吗?(2)条件表达式不是常量表达式,那么为什么“语法允许任何需要常数的条件表达式”@Tim:为什么您的文本编辑器允许您在需要常数的地方编写
    f(x)
    ?这不是你的文本编辑器的工作来执行,也不是语法的工作。至于表示这些语法规则的语法,第一行之后的每一行(带冒号)都是非终结符可以扩展到的序列。谢谢。我想知道如何理解常量表达式的语法?1) 它没有指定常量表达式的定义吗?2) 它是否只指定条件表达式的运算符比常量表达式中的某些运算符具有更高的优先级?但是常数表达式可能有算术运算符,它们的优先级高于条件表达式的运算符。