【问题标题】:Difference between pre- and postfix incrementation in C (++a and a++) [duplicate]C(++a和a++)中前缀和后缀递增之间的区别[重复]
【发布时间】:2014-12-15 09:45:57
【问题描述】:

据我了解,a++ 是后缀自增,它将 a 加 1 并返回原始值。 ++a 是前缀递增,它给广告加 1 返回新值。

我想尝试一下,但在这两种情况下,它都会返回新值。我误会了什么?

#include <stdio.h>
int main() {
  int a = 0;
  int b = 0;

  printf("%d\n", a); // prints 0
  printf("%d\n", b); // prints 0

  a++; // a++ is known as postfix. Add 1 to a, returns the old value.
  ++b; // ++b is known as prefix. Add 1 to b, returns the new value.

  printf("%d\n", a); // prints 1, should print 0?
  printf("%d\n", b); // prints 1, should print 1

  return 0;
}

【问题讨论】:

  • 不,只有当你有类似 printf("%d\n", a++); printf("%d\n", ++b);
  • 行为是正确的,你对后增量的理解是错误的。如果您执行printf("%d\n", a++);,您想要的行为将是可观察的,它会打印然后会增加。在你的情况下,它会增加,然后你打印它。
  • 你没有使用返回值,所以你不应该期望看到差异
  • 不知道为什么会有大量的反对票。这本身并不是一个坏问题。肯定存在大量糟糕问题的文化,而这并不真正属于这一类。
  • 谢谢Qix。如果已经存在类似的问题,我想我应该更彻底地检查一下。

标签: c increment postfix-operator prefix-operator


【解决方案1】:

请记住,C 和 C++ 是一些表达能力强的语言。

这意味着大多数表达式都会返回一个值。如果你不利用这个价值做任何事情,它就会被时间流逝。

表达式

(a++)

将返回 a 以前的值。如前所述,如果它的返回值没有被立即使用,那么它与

(++a)

返回新值。

printf("%d\n", a++); // a's former value
printf("%d\n", ++b); // b's new value

上述语句将按您的预期工作,因为您正在使用那里的表达式。

下面的也可以。

int c = a++;
int d = ++b;

printf("%d\n", c); // a's former value
printf("%d\n", d); // b's new value

【讨论】:

  • 这些帽子正在引起路过投票。
  • 我不明白为什么对所有答案都投了反对票
  • @Gopi 很可能是一位用户决定我们不应该回答。这可能与帽子有关,因为您可以通过达到投票上限来获得一顶帽子。
  • 我从来不知道这件事。那么这是什么帽子呢?否决正确答案是没有意义的
  • @Gopi 这是今年年底的“娱乐”活动。查看this link
【解决方案2】:

在前缀递增的情况下,++.. 运算符被计算并首先执行递增,然后递增的值成为操作数。

在后递增的情况下,将评估 ..++ 运算符,并在包括该操作数在内的其他评估完成后安排递增。这意味着,操作数的现有值用于其他评估,然后增加值。

为了更好地理解它,请使用另外两个变量,cd,并检查以下值。

#include <stdio.h>
int main() {
  int a = 0;
  int b = 0;
  int c = 0;
  int d = 0;   

  printf("%d\n", a); // prints 0
  printf("%d\n", b); // prints 0

  c = a++; // a++ is known as postfix. Add 1 to a, returns the old value.
  d = ++b; // ++b is known as prefix. Add 1 to b, returns the new value.

  printf("%d\n", a);   // is 1
  printf("%d\n", b);    // is 1
  printf("%d\n", c);    // is 0; --> post-increment
  printf("%d\n", d);    // is 1  --> pre-increment

  return 0;
}

【讨论】:

  • 哇!!亲爱的投票者,请问有什么 cmets 吗?
  • 回答一个明显重复的问题,因此没有用(在我看来)
  • @MatthiasB 好吧,你是,但是,你有没有注意到,欺骗链接 没有 有一个可接受的答案?也许,在这个过程中,这个问题可以与此相关联,因为可能存在一些更好的接受的答案。谢谢。 :-)
  • @MatthiasB 您可以随心所欲地投反对票,但通常您不会对欺骗问题的答案投反对票。没有意义。
  • 一个有效的点。也许合并问题是一种选择,但我不知道是否有办法启动它。 @Qix 我对 Meta 做了一些研究,这似乎是共识,所以我很抱歉。
【解决方案3】:

a 增加,但它返回旧值。但由于它单独在一条线上,所以结果被忽略了。试试这个来说明区别:

#include <stdio.h>
int main() {
  int a = 0;
  int b = 0;

  printf("%d\n", a++);
  printf("%d\n", ++b);

  return 0;
}

【讨论】:

    【解决方案4】:

    没有a也加1。

    如果你有类似的东西

    p = a++;
    

    这里

    p = 0
    

    如果你有

    p = ++a;
    

    这里

    p =1
    

    因此,您可以将变量的值分配给其他变量,如上所示,并测试后增量和前增量会发生什么。

    【讨论】:

    • 为什么要投反对票?点赞是有道理的
    猜你喜欢
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2014-12-05
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    相关资源
    最近更新 更多