c - 变量的前置和后置增量操作在 TC 和 gcc 上给出不同的输出

标签 c gcc standards turbo-c

<分区>

这是我的简单代码...

#include<stdio.h>
int main()
{
int i=5;
printf("%d %d %d %d %d ",i++,i--,++i,--i,i);
return 0;
}

在 gcc 上,输出为 '4 5 5 5 5'

但在 TC 上,它给出的输出为“4 5 5 4 5”

据我所知,在 printf 语句中,如果它是单个表达式,则计算将从左到右,但在正常语句中,它将从左到右。

但如果 printf 包含多个表达式,则计算将在堆栈上,元素将从左到右压入堆栈,但从右到左弹出,这证明了 TC 输出

请指正我哪里错了???

最佳答案

C 没有指定应该按哪个顺序计算函数参数,因此它是未定义的,编译器可以按照他们选择的方式执行,包括任意和随机的。 Bjarne Stroustrup 在“The C++ Programming Language”第 3 版第 6.2.2 节中明确说明了这一点

他还给出了一个理由:

Better code can be generated in the absence of restrictions on expression evaluation order

关于c - 变量的前置和后置增量操作在 TC 和 gcc 上给出不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8681849/

相关文章:

c++ - 为什么 `std::is_function_v` 没有按预期工作?

c - 使用X11(GTK,GDK)功能从C发送键组合

gcc 和 clang 警告/错误标志

c++ - std::async 的奇怪行为

c - 在 C 中使用 static const unsigned long long int 变量分配 static const double

c# - 在 Visual Studio 中自定义 C# 标准文档生成器(XML 注释)

c - `close(fd)` 是否破坏文件表条目和/或 vnode 表条目?

c - 处理 C 中参数前后的命令行选项

c - 在 c 中使用 unistd.h 在 MAC OSX 上写入串行端口的问题

c - 结构声明中是否允许额外的分号?