为什么 printf 函数在以下代码中显示所需的输出
why the printf function showing desired output in the following code?
#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,但未指定。你仍然应该避免它
根据评估顺序,这是未定义的行为。 参考资料(请参阅章节 未定义的行为(
输出为:
33 1
因为它的计算结果如下:
a++
使用 A(1( 和 A 变为 2
++a
A 变为 3 并使用 A(3(
使用 A(3(
重要的是要知道a++
是后增量的,++a
是前增量的。后递增表示:使用该值并在之后增加它。预递增是指:递增值,使用递增值。
旁注:C++17 将其从未定义的行为更改为未指定,但在以前的版本中,它仍然是未定义的行为。
相关文章:
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- C++ 构造函数未显示输出
- 显示C++输出而不返回值
- 为什么输出窗口上没有显示输出?
- 为什么我的代码块上没有显示输出?
- C++ 程序不显示输出
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- 如何从amd gpus的显示输出中获取图像数据
- 插入了 C++ 数组字符串数据,但在显示输出时不显示
- 程序不会在必须时结束并显示输出
- 为什么我的前缀中缀代码不显示输出
- 函数显示输出和输入时出现问题
- 为什么我的程序多次显示输出
- 二进制搜索 - 代码编译并运行后不显示输出
- 字符串流未显示输出
- 为什么当我使用 cout 显示输出时,必须将按位运算符(例如 &,|,等)括在括号中?
- 这段代码可编译,但在visualstudio2015社区中运行(c++)时不显示输出
- Jupyter笔记本未显示C 输出(COUT)
- 尝试拆分循环链表.显示输出但崩溃.在 IDEone 中显示运行时错误
- Q未显示输出