这个话题我想讲很久了,主要在于很多萌新问出的这些学校的题目过于离谱而且没有意义,必须说一下。

什么是未定义行为?单纯的来说就是标准委员会也没有规定到底在那些情况下要发生什么结果,编译器产生的是未知的(虽然大部分时候是可以知道的)。有很多没有任何意义的题目,我们一一列举
#include<iostream> #include<string> void func(int a, int b) { std::cout << a
<< " " << b << std::endl; } int main() { int i = 0; func(i++, i++); return 0; }

上面是在MSVC,cpp的debug得出的结果,未开启优化 ,下面是release模式下的结果

 其实这还可能涉及入栈的问题,我们讨论下一个
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h>
#include<string.h> int main() { int i = 0; printf("%d %d %d %d", i++, i++, i--,
--i); return 0; }

上面的是MSVC debug模式下的结果,下面是release

这个例子我必须重点强调,会因为编译器的不同导致不同结果,且学校最喜欢这么出,可见出题人水平,标准的未定义行为,在c prime plus c++ prime
plus等热门的基础书都提过这种行为,别的不说,我起码还能找出三四种结果,使用gcc编译,或者手机编译器等等。

还有很多的未定义行为,我们不再一一列举,总之有些问题是没有意义的,我也清楚MSVC对于那种情况是按照入栈与一个寄存器,但是,依旧没有意义,实际开发不可能写这种代码,我不再讲更深入的,这是给萌新了解一下的

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信