微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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中,后缀不是一元运算符.这是一个后缀操作符.但是,除了这个标准中的术语之外,真的没关系,因为显然它是一个操作符,它有一个操作数,英语中的“一元”也是如此.

原文地址:https://www.jb51.cc/c/116520.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐