GCC与Turbo C编译器中序列点的行为差异及代码疑问
为什么
x = x++在GCC和Turbo C中输出不同? 嘿,你碰到的这个问题可不是GCC版本的锅,这其实是C/C++里最经典的未定义行为案例之一!
先给你掰扯清楚核心原因:C和C++的标准里明确规定,如果在同一个序列点内,对同一个变量既进行修改操作,又读取它的值(而且读取不是为了计算要修改的新值),这种代码的行为就是未定义的。简单说就是,编译器想怎么处理就怎么处理,没有任何强制要求它输出固定结果,不同编译器甚至同一编译器的不同优化级别都可能给出不一样的输出。
具体到你的代码x = x++:
- 你用的GCC 6.3是遵循现代C标准的编译器,它的处理逻辑是先获取
x++的返回值(也就是自增前的5),然后把这个值赋值给x,所以最终x还是5。 - 而Turbo C是古董级的编译器了,它遵循的是非常早期的C规范(甚至可能是ANSI C之前的预标准实现),它的处理逻辑完全不遵循现代标准对序列点的要求,所以出现了和现代编译器不同的结果——比如它可能先执行自增把x变成6,再完成赋值操作,最终输出6。
这里必须提醒一句:这种代码绝对不能出现在正经的编程里!它的行为完全不可预测,没有可移植性,不管是竞赛还是工程代码,都要避免写出这种依赖编译器实现的代码。如果想实现自增,直接写x++或者++x就行,别把赋值和自增混在同一个表达式里。
内容的提问来源于stack exchange,提问作者Nitish
相关产品推荐
相关产品推荐

