论++i + ++i + ++i

论++i + ++i + ++i

今天有个朋友找我,说他朋友问他这段代码为什么输出后面的值

#include<iostream>

int main(){
    int y = 4;
    int b = ++y + ++y + ++y;
    std::cout << b;
    
   	return 0;
}

他的截图里面是dev cpp运行下输出了19。

第一眼看过去就直接回了个ub。在上学期学长也说过。

但是可能那位朋友的朋友是个坚持不懈的人,非要个答案的话,也可以从汇编层面给他答案。

我用vs敲了一遍,然后发现输出的是21,而不是19。意料之中,上学期学长也说过这玩意是看编译器的。

然后vs自带的反汇编查看。

__i.png

右边底下红色的不小心位置不小心往下了一行233。

VS2019 community的逻辑是把 +运算符外的每一个++y都先算好,最后再加和起来。

而dev cpp是从最右边的+运算符开始。把最右边的左右两边的++y算好。然后加和起来。再算左边+运算符的左右两边的数。

结语

感觉这个没啥意义啊。不过对于一些非要打破砂锅问到底的人,看汇编毫无疑问是一个很好的方法。至少能让对方心服口服。

一些ub是根据编译器作者的逻辑来进行编译的,纠结于此没啥意义。

posted @ 2020-04-09 13:18  LeoRanbom  阅读(...)  评论(...编辑  收藏