为什么 printf 函数在以下代码中显示所需的输出

why the printf function showing desired output in the following code?

本文关键字:显示 输出 代码 函数 printf 为什么      更新时间:2023-10-16
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int a=1;
    printf("%dt%dt%dn",a,++a,a++);
    return 0;
}

为什么代码的输出是3 3 1的。 有人向我解释这种输出是如何发生的?

似乎您的编译器从右到左读取参数

printf("%dt%dt%dn",a,++a,a++); // a = 1

a++ 返回 a 并将其递增 1

printf("%dt%dt%dn",a,++a, 1); // a = 2

++a 将 a 递增 1 并返回结果

printf("%dt%dt%dn",a, 3, 1); // a = 3

A 只是一个

printf("%dt%dt%dn", 3, 3, 1); // a = 3

但是 AFAIK 这有点 UB,因为 c++ 标准没有规定参数的读取顺序,所以我不会打赌它在不同的编译器上

是一样的

编辑:使用C++17,它不再是UB,但未指定。你仍然应该避免它

根据评估顺序,这是未定义的行为。 参考资料(请参阅章节 未定义的行为(

输出为:

3

3 1

因为它的计算结果如下:

a++
使用 A(1( 和 A 变为 2
++a
A 变为 3 并使用 A(3(
使用 A(3(

重要的是要知道a++是后增量的,++a是前增量的。后递增表示:使用该值并在之后增加它。预递增是指:递增值,使用递增值。

旁注:C++17 将其从未定义的行为更改为未指定,但在以前的版本中,它仍然是未定义的行为。