Mus*_*ful 1 c++ syntax operators operator-precedence associativity
是运算符优先级和结合规则曾经在任何C/C++表达式侵犯?
如果是这样,你能举个例子吗?
假设优先权和关联性规则的主张是:
每个运算符都有一个给定的优先级,每个优先级都有给定的关联性.如果两个运算符看到一个子表达式,它们期望一个操作数,则它属于具有更高优先级的子表达式.关系破坏了关系.
该标准将C/C++表达式定义为CFG,它比基于优先级的解析器灵活得多.例如,可能会给二元运算符赋予不对称的"优先级",这会使任何优先级表不正确.但是,在我看来,语法的设计受到限制,以维护简单的优先规则.以下是我遇到的一些所谓的"反例":
a?b,c:d不解释为(a?b),(c:d)一些人声称?:运算符对其中间操作数的优先级不同于其他操作数的优先级,因为a?b,c:d,例如,不被解释为(a?b),(c:d).但是,既不占b也不c占据它?:作为内部操作数的位置.通过这种推理a[b+c]应该被解释为(a[b)+(c]),这是荒谬的.
sizeof(int)*a被解释为(sizeof(int))*a而不是sizeof((int)(*a))...因为C不允许作为sizeof的运算符进行upresthesized强制转换.但是,这两种解释都符合优先规则.混淆来自*运算符的模糊性(是二元运算符还是一元运算符?).优先级表并不意味着解决操作员的歧义.毕竟,它们不是operator- symbol -precedence表.因此运算符优先级规则本身是完整的.
a+b=c导致语法错误,而不是语义错误a+b=c根据标准,是无效的C 语法.如果C有一个基于优先级的解析器,它只会在语义级别被捕获.在C中,任何不是一元表达式的表达式都不能是l值.因此,这些语义上注定的LHS表达式不需要在语法上适应.它对整个语言没有任何影响,优先级表不需要预测将由表达式产生的错误的语法/语义.
举一个例子,通常的优先级表说sizeof和cast表达式具有相同的优先级.表格和标准都表示它们从右到左关联.
当你正在观察时,这种简化是很好的*&foo,这意味着同样的*(&foo).
它也可能会告诉你,这sizeof (int) 1是合法的C++,它意味着同样的东西sizeof( (int) 1 ).但这不合法,因为事实上sizeof( type-id )它在语法上是一个特殊的东西.它的存在阻止sizeof (int) 1了一个sizeof表达式,其操作数是一个其操作数为的转换表达式1.
所以我认为你可以说C++语法中的"sizeof(type-id)"生成是通常的优先级/关联表所说的例外.他们确实准确地描述了" 一元表达式 "的生产.