gpt4 book ai didi

c - 如何理解C99标准语法

转载 作者:行者123 更新时间:2023-12-02 01:19:06 25 4
gpt4 key购买 nike

我不太明白C99中语法的含义。这里所说的 C99 是指 ISO/IEC 9899:1999。嗯,我认为语法语法部分自 ANSI C、C89 以来没有太大变化。

this question 为例:

6.5.5 Multiplicative operators
Syntax
multiplicative-expression:
cast-expression
multiplicative-expression * cast-expression
multiplicative-expression / cast-expression
multiplicative-expression % cast-expression

Constraints

Each of the operands shall have arithmetic type. The operands of the % operator
shall have integer type.

Semantics

The usual arithmetic conversions are performed on the operands.
The result of the binary * operator is the product of the operands.
The result of the / operator is the quotient

我想知道为什么在乘法运算符的语法中我们有一个“强制转换表达式”?而这个语法又蕴含着什么样的语法呢?在 that question @Avi 说过

a*b*c

“c 必须被解析为强制转换表达式”,我不太明白这一点。

再举一个c99 6.6.1的例子,常量表达式的语法

Syntax
constant-expression:
conditional-expression

为什么这个条件表达式会出现在这里?有人可以告诉我如何解释这些语法吗?谢谢大家。

最佳答案

I wonder why in the syntax of multiplicative operators we have a "cast-expression" ?

这是上下文无关语法中使用的典型设备,用于指定相同优先级的运算符的分组并首先指定优先级(好吧,这并不精确;语法可以表达的不仅仅是分配优先级到运算符,但如果我们只想在 CFG 中表达简单的基于优先级的表达式求值,我们就会这样做)。 cast-expressionmultiplicative-expression 没有任何关系;它只是“任何不包含乘法运算或较低优先级运算的表达式”。

那么,这将如何工作:

  1. 相同优先级运算符的分组:

    1*2*3*4

    在这种情况下,有以下分组可能性(仅限顶层):

    • 1*(2*3*4)
    • (1*2)*(3*4)
    • (1*2*3)*4

    通过查看语法,我们知道 * 左边的内容一定是 cast-expression,即不能包含(不带括号的)*。因此,只有第三种方案可行

  2. 优先级。想象一下表达式

    a*b+c

    它可以被解析为

    • (a*b)+c
    • a*(b+c)

    但是,我们知道右侧的 cast-expression 不能包含(无括号的)+ (或者我们可以从语法中计算出来,如果我们检查它)。这使得第一个选项成为唯一可能的选择。

    另一种表达方式

    a+b*c

    又可以被解析为

    • (a+b)*c
    • a+(b*c)

    但是,* 左侧的乘法表达式 也不能包含(未加括号的)+ (留作练习读者)。因此,只有第二种方案可行。

关于条件表达式的问题:语法规则不允许将任何等效或低于赋值运算符的内容解析为常量表达式。因此,a=ba,ba+=b不可能是常量表达式,而a+ba[b]a(b) 可能可以。请注意,它并不禁止例如。 (a=b);您必须查看指定什么是常量表达式的实际子句,这比语法更限制常量表达式的范围。

关于c - 如何理解C99标准语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10316307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com