【问题标题】:I don't understand why a equals 1 and b equals 0 in this program [duplicate]我不明白为什么在这个程序中 a 等于 1 和 b 等于 0 [重复]
【发布时间】:2020-04-03 00:00:43
【问题描述】:

我不明白为什么最后 a 等于 1 而 b 等于 0。在我看来,它们应该是相同的。提前致谢。

#include "stdio.h"

int main()
{
    int a=0;
    int b=0;
    a++;
    printf("a=%d,b=%d",a,b++);
    return 0;
}

【问题讨论】:

  • 你知道“post-increment”中的“post”代表什么吗?
  • 你了解b++(即post增量)的作用吗?
  • 您使用了后自增运算符。所以'b'在增量发生之前被评估。要实现 a == 1 && b == 1,请使用前置自增运算符 (++b)。
  • 去掉a++;,把printf("a=%d,b=%d",a,b++);改成printf("a=%d,b=%d",++a,b++);,结果还是一样的。

标签: c printf operators post-increment


【解决方案1】:

这次通话之前:

printf("a=%d,b=%d",a,b++);

变量 a 已经增加了:

a++;

然而在printf的指向调用中,后增量表达式b++的值是变量b在其增量之前的值。所以输出 1 和 0。

如果你想得到输出1和1,那么使用带有变量b的预增量表达式,比如:

printf("a=%d,b=%d",a,++b);

来自 C 标准(6.5.2.4 后缀递增和递减运算符)

2 后缀 ++ 运算符的结果是 操作数。作为副作用,操作数对象的值是 递增(即,将适当类型的值 1 添加到 它)...

【讨论】:

    【解决方案2】:

    操作b++ 在执行增量之前将b 发送到printfa 在调用 printf 之前递增

    【讨论】:

    • 实际上,增量必须在调用 printf 之前完成,因为 C 2018 6.5.2.2 10 表示在参数评估之后和调用之前有一个序列点。所以b 在增量之前不会“发送”到printf。相反,b++b 在增量之前的值,传递给 printf 的是这个值,而不是 b
    • 我试图保持简单
    • 简单来说b++的值就是b在增量前的值,而b的增量是一个副作用。
    【解决方案3】:
    printf("a=%d,b=%d",a,b++);
    

    逻辑上等价于:

    printf("a=%d,b=%d",a,b);
    b++; 
    

    【讨论】:

    • 这些不是等价的;根据 C 2018 6.5.2.2 10,必须在函数调用发生之前执行对 b 的增量。如果被调用函数可以访问 b(因为它是通过外部链接定义的,或者它的地址已在某些方式),被调用的函数将看到 b 的增量值,前者但看不到后者。
    • @EricPostpischil 我说的是“逻辑上”等价的。
    • 它们在逻辑上不等价;他们有不同的可观察行为。
    • @EricPostpischil 我得调查一下。
    • #include <stdio.h> 之后,int b=0; void foo(int x) { printf("%d %d\n", x, b); } int main(void) { foo(b++); } 打印“0 1”,但int b=0; void foo(int x) { printf("%d %d\n", x, b); } int main(void) { foo(b); b++; } 打印“0 0”。
    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 2010-12-08
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多