- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对后缀/前缀运算符的优先级 和关联性 感到困惑。
一方面,当我阅读 K&R 书时,它指出:
(*ip)++
The parentheses are necessary in this last example; without them, the expression would increment ip instead of what it points to, because unary operators like * and ++ associate right to left.
没有提及任何后缀/前缀运算符之间的关联性差异。两者一视同仁。该书还指出 * 和++ 具有相同的优先级。
另一方面,this page指出:
1) Precedence of prefix ++ and * is same. Associativity of both is right to left.
2) Precedence of postfix ++ is higher than both * and prefix ++. Associativity of postfix ++ is left to right.
我应该相信哪一个?多年来,它是否随着 C 修订版而发生了变化?
最佳答案
TL;DR:这两个描述说的是同一件事,使用相同的词语和符号,但含义略有不同。
On one hand, as I'm reading K&R book, it states that:
(*ip)++
The parentheses are necessary in this last example; without them, the expression would increment ip instead of what it points to, because unary operators like * and ++ associate right to left.
没有提及两者之间的关联性差异 后缀/前缀运算符。两者一视同仁。本书还 声明 * 和++ 具有相同的优先级。
不清楚您正在阅读哪个版本的 K&R,但至少第一个版本确实将递增和递减运算符的前缀和后缀版本分别视为单个运算符,其效果取决于它们的操作数是在前面还是后面他们。
On the other hand, this page states that:
1) Precedence of prefix ++ and * is same. Associativity of both is right to left.
2) Precedence of postfix ++ is higher than both * and prefix ++. Associativity of postfix ++ is left to right.
语言标准和大多数现代处理方法将前缀和后缀版本描述为不同的运算符,通过它们相对于操作数的位置来消除歧义。这个答案的其余部分解释了为什么这是对同一事物的另一种描述。
请注意,当只涉及一元运算符时,结合律问题只会出现在具有相同优先级的一个前缀和一个后缀运算符之间。在只有前缀或只有后缀操作的链中,关于它们如何关联没有歧义。例如,给定 - - x
,您不能将其有意义地分组为 (- -) x
。唯一的选择是 - (- x)
。
接下来,观察所有最高优先级运算符都是后缀一元运算符,并且在 K&R 中,所有第二优先级运算符都是前缀一元运算符,除了 ambi-fix ++
和 --
。然后,将从右到左的结合性应用于第二优先运算符,只消除涉及后缀 ++
或 --
和前缀一元运算符的表达式的歧义,并在支持后缀运算符。这等同于区分这些运算符的后缀和前缀版本并为后缀版本分配更高优先级的现代方法。
要获得现代描述的其余部分,请考虑我已经做出的观察,即仅当前缀和后缀运算符被链接时,一元运算符才会出现结合性问题,并且所有最高优先级运算符都是后缀一元运算符。将后缀 ++
和 --
区分为独立的、比它们的前缀版本具有更高优先级的运算符,可以将它们放在它们之间的自己的层中其他后缀运算符和所有前缀运算符,但是将它们与所有其他后缀运算符放在同一层中不会改变任何表达式的解释方式,而且更简单。这就是如今它通常的表示方式,包括在您的第二个资源中。
至于从左到右 与 从右到左的结合性,问题是,对于仅包含前缀或仅包含后缀运算符的优先级层,没有实际意义。但是,将后缀运算符描述为从左到右关联,将前缀运算符描述为从右到左关联,这与其语义运算顺序是一致的。
关于c - 后缀/前缀运算符优先级和结合性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56740022/
int x = 1; System.out.println( x++ + x++ * --x ); 上面的代码打印出“5”,但我不明白怎么办?我一直为最后一个 x 取零,然后乘以仍然为 0 的第二个
我现在正在尝试使用 Preference 类 首选项 pfrOfThis = Preferences.userNodeForPackage(this) 出现错误: “类 java.util.prefs
用下面的代码 import sys print "Hello " + sys.argv[1] if len(sys.argv) > 1 else "Joe" + "." 当我运行时 python he
我的网页包含: td { padding-left:10px; } 引用的样式表包含: .rightColumn * {margin: 0; padding: 0;} 我在 rightc
使用 JPA 我有一个关于 CascadeTypes 的问题。 例如: @ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST,
下面的“括号”是怎么写的? val words = List("foo", "bar", "baz") val phrase = "These are upper case: " + words ma
我只是想知道,对于以下代码,编译器是否单独使用关联性/优先级或其他一些逻辑来评估。 int i = 0, k = 0; i = k++; 如果我们根据关联性和优先级进行评估,postfix ++具有比
我设置了一个 Azure FrontDoor 服务,以主/备份类型的方式将流量分配给两个 API 管理服务。就像我希望所有流量都流向我的主要 APIM 服务一样,如果我碰巧关闭该服务(假装中断),那么
这是一个简单的 CSS: /* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-devi
我设置了一个 Azure FrontDoor 服务,以主/备份类型的方式将流量分配给两个 API 管理服务。就像我希望所有流量都流向我的主要 APIM 服务一样,如果我碰巧关闭该服务(假装中断),那么
来自 Programming Perl pg 90,他说: @ary = (1, 3, sort 4, 2); print @ary; 排序右侧的逗号在排序之前求值,而左侧的逗号在排序之
+----+------------+------+ | id | title | lang | +----+------------+------+ | 1 | title 1 EN |
如何使用 Java 获取 DiffServe 代码点 (DSCP) 整数的优先级部分?我预计它涉及位移位,但由于某种原因,我似乎无法获得我期望的值。 最佳答案 假设我理解正确,只需向右执行 3 位逻辑
我有下一个运行良好的 js 函数: $(function () { $(".country").click(function () { var countries = Arra
int a[3]={10,20,30}; int* p = a; cout << *p++ << endl; 根据 wikipedia ,后缀++的优先级高于解引用,*p++应该先运行p++再解引用结
我想在优先读取归档后解决这种类型的表达式 2+3/5*9+3-4 这是我尝试解决该任务的代码我该如何解决这个问题 while ( !inputFile.eof() ) { getline( inp
我正在玩 Rhino 并注意到这种奇怪的行为似乎是运算符优先级: js> {}+{} NaN js> ''+{}+{} [object Object][object Object] js> ''+({
我想遍历文件列表并检查它们是否存在,如果文件不存在则给出错误并退出。我写了下面的代码: FILES=( file1.txt file2.txt file3.txt ) for file in ${FI
我正在执行级联 SELECT: SELECT * FROM x WHERE a = 1 AND b = 2 AND c = 3 => If nothing found, try: SELECT * F
即将参加考试,我正在参加之前的考试。 问题: 当两个或多个样式表规则应用于同一元素时,以下哪种类型的规则将优先? 一个。任何来自浏览器的声明 b.有用户来源的正常声明 C。作者来源正常声明 d.文档级
我是一名优秀的程序员,十分优秀!