c – 一元运算符是否联想是否有意义?

来自 http://en.cppreference.com/w/cpp/language/operator_precedence的C运算符优先表(我知道这不是规范性的,但标准不涉及优先级或关联性)将一元运算符标记为右/左关联.

一个不同的问题的讨论中,我有疑问.一元运算符是否联想是否有意义?

解决方法

这只是一种从语法衍生出来的方式的文艺.

添加相关联的原因是加成表达的一个生成是加性表达乘法表达,其中加性表达在左侧.所以当你看到:

a + b + c

这必须等同于(a b)c,因为匹配生产的唯一方法是将b作为加性表达式,c作为乘法表达式. a自己是一个加性表达式,但是b c不是乘法表达式,所以如果我们试图以a为加性表达式,则b c与生产不匹配.

如果您以前没有,建议您阅读“表达式”章节,忽略语义:仅查看语法生成.那么你会看到它的优先级和关联性是如何由语法定义的.大窍门是每一种“高优先级”的表达方式都是“低优先级”的表达形式.因此,每个乘法表达式都是一个加性表达式,而不是相反的,这就是使得乘法“加重”比增加.

前缀一元运算符在语法中定义,如:unary-expression:cast-expression等,左侧的运算符为前缀,右侧为后缀.换句话说,我们在左边插入括号,用于后缀,右边是前缀.也就是说,我们可以说,后缀操作符的分组是从左到右,前缀操作符从右到左.而C标准确切地说(C 03中的5.2 / 1和5.3 / 1).这可能是滥用术语或至少将新一代的这种一元分组称为“联结性”.但它不是一个主要的,因为它是明显的是什么意思.

二进制和一元运算符之间唯一的区别是,如果二进制运算符按相反方向分组,则语法仍然有意义,因此a – b – c表示 – (b – c).这将是令人惊讶的,但不会影响语言.使用一元运算符,将!! a as(!!)a组合起来将会更加令人惊讶,因此语言也必须为子表达式提供一个含义,这个子表达式目前没有.功能语言可以给它一个意思:可能意味着由…组成的功能!和!,即与static_cast< bool>()相同的操作,但C没有构成函数或运算符的概念. C不需要提供这个意思的原因是! “从右到左”.哪个(因为语法中的大窍门)只是另一种说法呢?不是一个语法正确的表达式,所以从来不是任何东西的子表达式.

所以是的,说从前到后,前缀运算符组从右到左和后缀运算符组合是有道理的.但是,由于其他我们对C语言的了解,所以它一定是这样的.

Btw,我认为在技术上至少在C中,后缀不是一元运算符.这是一个后缀操作符.但是,除了这个标准中的术语之外,真的没关系,因为显然它是一个操作符,它有一个操作数,英语中的“一元”也是如此.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...