【问题标题】:Why postfixed has higher precedence than prefixed? [duplicate]为什么后缀的优先级高于前缀? [复制]
【发布时间】:2017-12-08 19:33:07
【问题描述】:

案例一:

int i = 10;
int j = i++;

这里,首先将 i 的值赋给 j,然后 i 增加 1。

案例 2:

int i = 10;
int j = ++i;

在这里,首先 i 增加 1,然后分配给 j。

那么,如果增量的操作是先在前缀形式中进行的,那为什么后缀的优先级高于前缀呢?

【问题讨论】:

  • 操作的优先级与操作本身的性质松散相关。
  • 前缀=增量和返回,后缀返回和增量
  • 嗯..不知道为什么那个重复...
  • @EugeneSh。 - 如果你知道的话,我可以把它改成更好的:)
  • Precedence 是一个独立的求值顺序概念。评估顺序受依赖关系的约束:一个操作需要先评估其输入操作数,然后才能产生输出。给定a * (b + c),我们可以在执行单个算术运算之前评估abca * b + c也是如此。

标签: c operator-precedence


【解决方案1】:

这与优先级无关。(此处)在预增量中,分配的值是副作用发生之前的值。 对于预增量,它将是副作用之后的值。

int i = 10;
int j = i++;

i 的递增值之前是 10。所以j=10 在这两条语句执行之后。

int i = 10;
int j = ++i;

这里的值将是 11。因为 incremenet 先完成然后分配。

【讨论】:

  • 我想问题是,如果我们清除周围的所有噪音,那就是“为什么后增量的优先级高于前增量”。我会说 - 为了方便编写一些常见的构造。
  • @EugeneSh..:但问题的上下文完全不同,不是吗?
  • 是的。这让我有一种强烈的关闭它的冲动。
  • @StephanLechner.: 否则是的……写前一团糟
【解决方案2】:

Linux manual 页面的operator 定义为same priority 前/后increment

! ~ ++ -- + - (type) * & sizeof      right to left

后自增规则先赋值后自增

int j = i++;// here first whatever i value is there that will be assigned to j

预增规则是先增后赋值

int j = ++i;//++i itself will change i value & then modfied value will assign to j.

例如考虑下面的例子

#include<stdio.h>
int main()
{
        int x = 10;
        int *p = &x;// assume p holds 0x100
        printf("x = %d *p = %d p = %p\n",x,*p,p);
        ++*p++;
        /** in above statement ++ and * having same precedence,then you should check assocaitivity which is R to L
          So start solving from Right to Left, whichever operator came first , solve that one first 
          first *p++ came , again solve p++ first, which is post increment,so address will be same 
         *0x100  means = 10
         now ++10 means = 11
         **/
        printf("x = %d *p = %d p = %p\n",x,*p,p);
}

【讨论】:

  • 这是不正确的。这是正确的优先级表:en.cppreference.com/w/c/language/operator_precedence
  • 是的,但是两者有什么区别?根据您提供的链接,我在一行中提到的任何操作员都具有相同的优先级或优先级 1。关联性是从右到左,从右到左开始,在所有优先级中具有最高优先级的优先级为 1。
  • 不同之处在于您执行++*p++ 之类的操作。
  • 我对此毫不怀疑。 *和++优先级相同所以从右到左开始,所以首先执行*p++。
  • 我明白你的意思。会试着想一个反例(如果有的话:))
猜你喜欢
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
相关资源
最近更新 更多