你就是这样写c++代码的?我要开除你!!!

你就是这样写c++代码的?我要开除你!!!

编码文章call10242025-03-09 16:01:2346A+A-

哈哈,各位小伙伴,我是晚上加班到十点,又来给大家分享IT编码知识的贰臣同学,又是加班牛马的一天啊,各位老规矩啊,觉得写的好的,求关注啊。。。

下面开始正文,今天啊,有个工作不到一年的新员工,经验真的欠缺,都不知道C++ 的 UB(undefined behavior)未定义行为,真的是为所欲为啊,写代码测试也太随意了,写完卡卡就想合入主干,还好被我检视出来了,要不这代码要是上了库,怕是我的小兄弟要提桶跑路喽。。。。

额,简化一下今天小兄弟开发的代码,核心抽出来如下:

#include 

int main () {
 int a = 2;
 printf("%d, %d, %d", 
        a, (a = (a + 2)), (a = (a + 3)));  
  // 小兄弟这里预期打印2, 4, 7
 system("pause");
 return 0;
}

然后,他兴高采烈的在自己的机器上测试,UT单元测试瞬间跑过啊。。多跑了好几次,每次都能跑过,看着完全没毛病啊,然后就自信满满的提了代码,提到我这里了。

然后我瞬间就看傻了, 还好是私下让我检视,这要是让组里其它人知道了,这小兄弟怕是当天就要提桶跑路了。。

大家看出问题了吗?

哈哈,其实,上面代码的第5行,就是一个典型的C++语法规范中的未定义行为,未定义行为预示着什么呢?就是说,我完全不保证结果的确定性,不同的编译器对于C++的未定义行为,可能实现都不一样,表现也完全不一样。

那为啥小兄弟的电脑跑了那么多遍UT测试,都稳稳的,没表现出啥异常啊?

这就要说到不同的编译器了,我小兄弟的电脑刚好装的是x86-64 clang 18.1.0的编译器,你说好巧不巧,这个clang 编译器,它就是稳定2,4,7,就是这么实现的。

不信你看下面截图:

当场我就笑哭了,我说,大哥,你都不看那些编译器warning 吗? 都告诉你-Wunsequence了,你是拿bug 当特性玩啊,玩的挺花啊。。

这小子还挺不服气,说,这不是结果没啥问题吗?你看,每次都是稳定输出2, 4, 7

然后,为了让这小子服气,我瞬间换了一个编译器,用了一把x86-64 gcc13.2 编译器。

同样运行上面的代码,结果如下:

小兄弟,你看到了没,你大哥我换一个编译器,立马结果就完全不一样了,说句不好听的,咱们的项目可是要支持多个平台,得有平台兼容性的啊。

你瞅瞅,你咋办。。。

我改还不行嘛,最终,在我唐僧式的摆事实讲道理面前,小兄弟总算打发走去乖乖改代码了。

不禁唉声叹气,这届新人真难带,还得是00后整顿职场啊。

好嘞,各位粉丝和即将成为粉丝的大家,上面的故事还喜欢吗?再次再次,重点的重点,关注我,关注我,关注我!!!想听什么给我留言哟,目前决定的,每周一篇合集的有鸿蒙内核源码走读系列,每周六更新。。。

只要关注我,给我留言,有关IT 的问题我都会尽力给大家解答啊。。我致力于免费分享有用的知识。。。。。

关注关注关注!!!!

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4