可爱的编译器优化 你这叫我情何以堪

    最近在写程序时遇到了个稀奇古怪的问题。

    程序的本意是向number数组中依次赋予一个随机数,一旦新产生的随机数在之前出现过,则重新获得随机数。于是我就写下的如下所示的程序,想着到15行时发现两个变量不相等,即说明之前是由于重复数字出现跳出来的,那么执行其中的continue直接回到第4行

1  int i = 0, j = 0;
2  do
3  {
4     number[i] = get_rand_num();
5     if(i > 0)
6     {
7        for(j = 0; j < i; ++j)
8        {
9           if(number[i] == number[j])
10          {
11             break;
12          }
13       }
14    }
15    if(j != i)
16    {
17       continue;
18    }
19 } while(++i < TOTAL);


    奇怪的事出现了,number数组中依然会有重复的数字出现。我用gdb进行调试,发现无论怎样程序都不会执行第15到18行@#¥%……,真是活见鬼了,难倒电脑出问题了?

    之后无意中将第11行注释掉,在调试时发现第9行的判断语句也不执行了,此时我才恍然大悟。

    首先,number数组中依旧出现重复数字是由于我对do...while...中的continue理解不对。当执行到continue时会跳过循环中的其他语句去判断while中的条件,而并非直接跳回第4行。估计是之前总写while中的continue,一到while总往上跳,惯性思维了……

    其次,程序无论如何不会执行15到18行是由于编译器对代码进行了优化。基于之前所说的,continue会跳到while去再次判断条件,那么无论i与j是否相等都会去执行19行的代码,编译器遇到这种无意义的判断就将其忽略了,不会将其编译进目标程序。

    最后,不要去轻易怀疑电脑在执行程序时出现问题,它是严格按照你的命令执行的,真正有问题的是你自己。

    这个问题纠结了我1天多,在此发表出来一是做个笔记,提醒自己不再犯同样的错误。再来是为遇到类似问题的朋友提供一种解决的思路,希望能有所帮助。

你可能感兴趣的:(优化,编译器)