如何阅读和理解C&C++标准及其中使用的语言语法?

Naw*_*waz 15 c c++ standards grammar parsing

我经常发现C和C++标准很难阅读和理解,即使是简单的英语句子和它们的措辞也会带来可怕的体验.最重要的是,语言语法完全是地狱.我相信很多人都有同样的感觉,至少我的朋友会这样做.

我想通过一些例子来理解它.让我们用这个(它试图解释为什么开始the conditional expression in C++不同the conditional expression in C:(转引自维基百科)

C和C++中的运算符绑定是通过因式语言语法(而不是优先级表)指定的(在相应的标准中).这会产生一些微妙的冲突.例如,在C中,条件表达式的语法是:

逻辑OR表达?表达式:条件表达式

而在C++中它是:

逻辑OR表达?表达式:赋值表达式

因此,表达式:

e = a <d?a ++:a = d

两种语言的解析方式不同.在C中,此表达式是语法错误,但许多编译器将其解析为:

e =((a <d?a ++:a)= d)

这是一个语义错误,因为条件表达式(可能是++)的结果不是左值.在C++中,它被解析为:

e =(a <d?a ++ :( a = d))

这是一个有效的表达.

请有人解释上面引文中的粗体文字!请用更多的例子解释语法(特别是那些C和C++不同的例子).

编辑:我只想知道如何阅读和理解它们.我的意思是,如果我用英语口语解释,那我该怎么做?

Pau*_*xon 6

这是对表达式C++语法的描述,它将赋值表达式定义为

assignment-expression:
    conditional-expression 
    unary-expression assignment-operator assignment-expression
Run Code Online (Sandbox Code Playgroud)

在简单的英语中,赋值表达式可以是条件表达式OR一元表达式,后跟赋值运算符,后跟赋值表达式.所以,你的下一个问题是"什么是条件表达式",你可以参考语法的那一部分,并继续前进直到你到达底部!

因此,在C++中,您可以看到您引用的运算符可以采用C中的"条件表达式",但也可以使用赋值

因此,在"C"开启时,您a = d将操作符的最后部分视为赋值,C语法不应该允许.相反,它似乎有些编译器解析操作的简单最后一部分a是在为

 e = (a < d ? a++ : a) = d
Run Code Online (Sandbox Code Playgroud)

但是在C++中,在那里找到一个赋值是有效的,所以a = d它被完整地接受为最终表达式,所以你得到

 e = (a < d ? a++ : (a = d))
Run Code Online (Sandbox Code Playgroud)


ice*_*ime 6

你必须引用赋值表达式.它在5.17/1 [expr.ass]的C++ 03标准中定义:

assignment-expression:
        conditional-expression
        logical-or-expression assignment-operator assignment-expression
        throw-expression

assignment-operator: one of
        = *= /= %= += -= >>= <<= &= ˆ= |=
Run Code Online (Sandbox Code Playgroud)

什么它说的是,一个赋值表达式可以:

  • 条件表达式
  • 逻辑或表达,随后通过一个分配的操作员随后是赋值表达式
  • 一个抛出表达式.

我没有引用所有内容的语法定义,因为这将是非常巨大的(最值得注意的是因为条件表达涵盖了很多东西).

所以我们首先看到的是赋值表达式可以是条件表达式,因此我们覆盖了C语法.C++标准添加的是,右侧:也可以是包含赋值运算符抛出的东西.

提供的例子很好:e = a < d ? a++ : a = d.

这里,右侧:逻辑或表达式(a因为一元表达式包含在逻辑或表达式中),后面是赋值运算符(=),后跟赋值表达式(d因为一元 -表达式包含在赋值表达式中.