刚刚在一个群里有人指出一个问题,他认为以下代码结果为15
(++i)+(++i)+(++i)
然后我用mingw环境编译了一下,结果是16
#include "iostream.h" int main(){ int i=3; cout<<(++i)+(++i)+(++i)<<endl; return 0; }
拆分以后发现最后i==6
似乎和预想的4+5+6没什么出入,那关键就是前面两个了。
后来我仔细想了想,发现mingw编译器编译的时候把两个i先++了再执行第一个相加操作,也就是5+5+6,过程如下
(++i) //i=4 (++i) //i=5 5+5 //5+5=10 (++i) //i=6 10+(++i) //10+6=16
java是这么理解的
(++i) //i=4 4+(++i) //4+5=9 9+(++i) //9+6=15
然后又有一个小伙伴来了个VS编译的实例,代码一样,不过结果是18
(++i) //i=4 (++i) //i=5 (++i) //i=6 (++i)+(++i)+(++i) //6+6+6=18
所以我劝各位小伙伴们没事不要写这么2B的代码或者拿这种代码去考别人,会挨骂的இ௰இ
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。
int i = 1; i = ++i ? i– ? (i++ + 5) : (–i – 5) : i – 1;
这是C++ Primer里面的一个例子,条件操作符完成的一个万恶的任务——隐藏代码。。。。
哈哈,最讨厌了
嗯嗯最讨厌啦
这种有违天理的代码,实在没有讨论的必要…严重违反序列点的相关定义啊…
所以我得出了最后一句话的结论⊙ω⊙
语言解析是一方面,另一方面是不同的编译器也会有不同的结果。
恩,所以我的例子里有mingw和vs的不同结果
优先级实现的不同。哈哈
确实,每种语言解析都不同。