• 编译器的差别gcc和VS


    问题的由来是我写了一个排序算法程序,在gcc编译器下运行,发现结果有问题,然后开展的寻找错误解决问题

    这是我写的一个简单的插入排序算法

    1. #include <stdio.h>
    2. //直接插入法排序函数主体
    3. //参数1:待排序的序列
    4. //参数2:序列的长度
    5. //实现从大到小的排序
    6. void insertSort(int array[],int arraySize)
    7. {
    8. int i , j , tmp,k = 0;
    9. for(i = 1 ; i < arraySize ; i++)
    10. {
    11. tmp = array[i];
    12. j = i - 1;
    13. while(j >= 0 && tmp > array[j])
    14. {
    15. array[j + 1] = array[j--];
    16. }
    17. array[j + 1] = tmp;
    18. }
    19. }
    20. int main()
    21. {
    22. int a[7] = {5,6,3,9,2,7,1};
    23. insertSort(a,7);
    24. int i = 0;
    25. for(i = 0 ; i < 7 ; i++)
    26. {
    27. printf("%d",a[i]);
    28. }
    29. printf("\n");
    30. return 0;
    31. }

    分别在两个不同的编译器中去编译运行,一个是vs2017环境、一个是Linux环境,他们用的编译器,分别是VS编译器和GCC编译器,同样的代码,运行出来的结果却不一样。 

    为了定位问题,于是乎,我在程序体中加了多句printf输出想查看过程信息

    具体代码我是这样写的,可以看一下

    1. #include <stdio.h>
    2. //直接插入法排序函数主体
    3. //参数1:待排序的序列
    4. //参数2:序列的长度
    5. //实现从大到小的排序
    6. void insertSort(int array[],int arraySize)
    7. {
    8. int i , j , tmp,k = 0;
    9. for(i = 1 ; i < arraySize ; i++) //循环遍历序列
    10. {
    11. tmp = array[i];
    12. j = i - 1;
    13. printf("i = %d , j = %d , temp = %d\n",i,j,tmp);
    14. while(j >= 0 && tmp > array[j])
    15. {
    16. array[j + 1] = array[j--];
    17. }
    18. for(k = 0;k<7;k++)
    19. {
    20. printf("%d",array[k]);
    21. }
    22. printf("\n");
    23. array[j + 1] = tmp;
    24. for(k = 0;k<7;k++)
    25. {
    26. printf("%d",array[k]);
    27. }
    28. printf("\n");
    29. }
    30. }
    31. int main()
    32. {
    33. int a[7] = {5,6,3,9,2,7,1};
    34. insertSort(a,7);
    35. int i = 0;
    36. printf("最终");
    37. for(i = 0 ; i < 7 ; i++)
    38. {
    39. printf("%d",a[i]);
    40. }
    41. printf("\n");
    42. return 0;
    43. }

    然后下面这是运行的结果,可以发现,第一次从while循环中出来,两边的值就不一样了,while中只写了一句话

    array[j + 1] = array[j--];

    好了,问题找到,就是出在这句话上

    于是乎,我们可以知道的是编译器不同造成的一个差别,并且我怀疑问题出在array[j + 1] = array[j--];这句话的j--上,于是上网查阅了相关资料,大体上是这样说的,我总结在下面了。

    在一个循环体之中

    gcc编译器 i++ 在遇到 '=' 符号时,会先增,而不是在一趟循环结束后再自增的

    而VS编译器,是在一趟循环结束后才会i++的

    这应该是gcc编译器对此做出了自己的优化

    所以针对这一块程序,while里面我们可以改成这样,分成两步走

    1. while(j >= 0 && tmp > array[j])
    2. {
    3. array[j + 1] = array[j];
    4. j --;
    5. }

    这下运行结果就没有问题了 

  • 相关阅读:
    【Codeforces】Codeforces Round 903 (Div. 3)【待补】
    nodejs + vue环境搭建
    MyBatis 配置 typeAliases 标签
    I/O设备的分配与回收
    Java之I/O
    无人机集群路径规划MATLAB:孔雀优化算法POA求解无人机集群三维路径规划
    SwiftUI Swift 教程之 14 个有用的数组运算符
    Kafka快速入门------kafka的基础知识
    源码升级gcc
    自控力前言
  • 原文地址:https://blog.csdn.net/qq_45570844/article/details/126691414