编译器的差别gcc和VS

article/2025/10/6 0:43:13

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

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

#include <stdio.h>//直接插入法排序函数主体
//参数1:待排序的序列
//参数2:序列的长度
//实现从大到小的排序
void insertSort(int  array[],int arraySize)
{int i , j , tmp,k = 0;for(i = 1 ; i < arraySize ; i++)	{tmp = array[i]; j = i - 1;		while(j >= 0 && tmp > array[j])	{array[j + 1] = array[j--];}array[j + 1] = tmp;}
}int main()
{int a[7] = {5,6,3,9,2,7,1};insertSort(a,7);	int i = 0;for(i = 0 ; i < 7 ; i++){printf("%d",a[i]);}printf("\n");return 0;
}

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

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

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

#include <stdio.h>//直接插入法排序函数主体
//参数1:待排序的序列
//参数2:序列的长度
//实现从大到小的排序
void insertSort(int  array[],int arraySize)
{int i , j , tmp,k = 0;for(i = 1 ; i < arraySize ; i++)	//循环遍历序列{tmp = array[i];j = i - 1;printf("i = %d , j = %d , temp = %d\n",i,j,tmp);while(j >= 0 && tmp > array[j])	{array[j + 1] = array[j--];}for(k = 0;k<7;k++){printf("%d",array[k]);}printf("\n");array[j + 1] = tmp;for(k = 0;k<7;k++){printf("%d",array[k]);}printf("\n");}
}int main()
{int a[7] = {5,6,3,9,2,7,1};insertSort(a,7);int i = 0;printf("最终");for(i = 0 ; i < 7 ; i++){printf("%d",a[i]);}printf("\n");return 0;
}

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

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

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

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

在一个循环体之中

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

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

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

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

while(j >= 0 && tmp > array[j])	
{array[j + 1] = array[j];j --;
}

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


http://chatgpt.dhexx.cn/article/8dc3qITj.shtml

相关文章

Visual Studio编译器使用总结

经历过各种坑。安装坑&#xff0c;使用坑&#xff0c;配置坑。 今天抽空把总结写一下。 下面例子为vs2015举例。 大部分公司因为时间的问题&#xff0c;基本项目都是从vs2015版本进行开发的。后续为了统一&#xff0c;也建议大家用vs2015创建工程。 一、安装篇 vs2017-19版本…

c语言的编译器vs2019的安装及简单实用

1.编译器的介绍与安装 刚开始学习c语言呢&#xff0c;少不了的就是对语言编辑和编译。简单来说&#xff0c;我们就是需要一个编译器来编辑和运行你的代码。 那么有什么好的编译器值得推荐呢&#xff1f;那就有很多了。但是比较广泛使用的编译器有Clang、GCC、MSVC、devc。这里我…

VS编译器常见的问题

VS编译器常见的问题 前言问题一——VS2013控制台一闪而过解决方法1解决方法2 问题二——scanf函数报错解决方法 问题三——新建多个源文件引起的报错解决方法1解决方法2 前言 我们在开始学习C语言时&#xff0c;会遇到各种编译器&#xff0c;VS&#xff0c;Dev-C&#xff0c;V…

linux如何对mysql进行定时备份并定时清理3天之前的备份数据

linux如何对mysql进行定时备份并定时清理3天之前的备份数据 一.Linux对mysql进行定时备份 1.确保Linux上是否已经安装了mysql以及crontab 安装mysql可参考:https://blog.csdn.net/m0_51285952/article/details/123371653 安装crontab可参考:https://blog.csdn.net/hukai0q/…

docker定时备份mysql-定时备份docker中mysql的数据

一、概念 方法一&#xff1a;备份是通过如下命令实现 docker exec -it mysql&#xff08;镜像号&#xff09; mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B test1&#xff08;数据库名称&#xff09;&#xff08;中间是有一个空格的&#xff0…

Windows系统下如何定时备份MySQL数据库

Windows系统下如何定时备份MySQL数据库 使用mysqldump备份sql文件 假设mysql环境 MySQL安装位置 D:\mysql\mysql-5.7.30-winx64需要备份的数据库名称 springMySQL数据库账号 rootMySQL数据库密码 123456数据库备份地址 D:/mysqlBackup/ 则脚本按照下面写法&#xff1a; echo of…

mysql设置定时备份

不管是什么类型的数据库&#xff0c;我们都需要定时的备份&#xff0c;以便在出问题时可以及时恢复&#xff0c;减少损失。sqlserver的备份很简单&#xff0c;sqlserver自带&#xff0c;这里主要给大家分享下mysql的自动备份如何设置。 1.工具&#xff1a;navicat2.数据库:mys…

【数据库】定时备份mysql数据库

目录 一、创建放备份的目录二、编写脚本三、创建软链接四、赋予该脚本可执行权限五、测试脚本是否能正常执行六、进入备份文件夹查看是否正常备份七、安装cron服务八、创建定时备份任务 一、创建放备份的目录 cd / 进入根目录 mkdir backup 创建备份…

Mysql数据库每天定时备份

1.先检查安装crontabs yum install crontabs 2.在home目录下指定路径新建文件夹 3.新建执行脚本,在里面写入命令 touch mysql_backup.sh shell脚本如下&#xff1a; #!/bin/bash #保存备份个数&#xff0c;备份14天数据 number14 #备份保存路径 backup_dir/home/tjgeo/bac…

Mysql定时备份

linux下如何实现mysql数据库每天定时自动备份 由于客户要求&#xff0c;需要将数据库进行每天定时自动备份&#xff0c;所以网上找了各种方式就行了测试&#xff0c;遇到很多坑&#xff0c;特此记录下来&#xff0c;步骤是东拼西凑的&#xff0c;虽然也是网上找的&#xff0c;…

Windows下 mysql定时备份

** 使用mysqldump进行数据库备份 ** mysql数据库自带备份命令mysqldump,可对数据库进行备份操作 最简单的备份是将数据库备份至本地&#xff0c;生成 **.sql文件 编写备份脚本文件 &#xff08;创建一个txt文件&#xff0c;写入批处理脚本&#xff0c;再将文件的后缀改为.ba…

MySQL定时备份数据库(全库备份)

MySQL定时备份数据库&#xff08;全库备份&#xff09; 一、MySQL数据备份 1.1、 mysqldump命令备份数据 在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导出dump,首先我们简单了解一下mysqldump命令用法: …

mysql定时自动备份数据库

我们都知道数据是无价&#xff0c;如果不对数据进行备份&#xff0c;相当是让数据在裸跑&#xff0c;一旦服务器出问题&#xff0c;只有哭的份了。下面将介绍mysql数据库的自动备份&#xff0c;大家可根据情况自行选择将备份数据存放在哪里。 第一种&#xff0c;数据跑在服务器…

windows系统mysql定时备份

一.介绍 本文章主要介绍了windows系统下如何创建mysql定时备份任务&#xff0c;目的&#xff1a;一是数据无价&#xff0c;一旦数据丢失&#xff0c;功亏一篑&#xff1b;而是将重复性的工作交给机器来做&#xff0c;省去人工处理成本。 二.创建bat任务脚本 1.新建txt文档 2.打…

MySQL 定时备份数据库(非常全)

一. mysqldump命令备份数据 在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导出dump,首先我们简单了解一下mysqldump命令用法: #MySQLdump常用 mysqldump -u root -p --databases 数据库1 数据库2 > xxx.s…

实战-MySQL定时增量备份(2)

阅读本文大约需要 9 分钟 实战-MySQL定时全量备份&#xff08;1&#xff09; 实战-MySQL定时增量备份&#xff08;2&#xff09; 实战-将MySQL备份上传到私有云(3) 概要 引言 增量备份 恢复增量备份 定时备份 引言 在产品上线之后&#xff0c;我们的数据是相当重要的&…

MySQL 数据库定时备份

1.编写BASH维护固定数量备份文件 在Linux中&#xff0c;使用vi或者vim编写脚本内容并命名为&#xff1a;mysql_dumps.sh #!/bin/bash #保存备份个数&#xff0c;备份31天数据 number31 #备份保存路径 backup_dir/root/mysqlbackup #日期 dddate %Y-%m-%d-%H-%M-%S #备份工具 …

Linux定时备份MySQL

Linux定时备份MySQL 1.备份脚本2.赋予脚本执行权限3.添加定时任务4. crontab定时任务表达式5. 常见问题6. linux软连接7.参考链接: 阅读本文您将了解到: 定时备份数据库linux定时任务crontab定时任务表达式shell脚本变量命名规则linux 软连接的使用vim使用技巧 1.备份脚本 用vi…

MySQL 如何定时备份数据库

目录 1.mysqldump命令备份数据 2.mysqldump常用操作示例 2.1. 备份全部数据库的数据和结构 2.2.备份全部数据库的结构&#xff08;加 -d 参数&#xff09; 2.3. 备份全部数据库的数据(加 -t 参数) 2.4.备份单个数据库的数据和结构(,数据库名mydb) 2.5. 备份单个数据库的…

MySQL 定时备份数据库(非常全),值得收藏!

在操作数据过程中&#xff0c;可能会导致数据错误&#xff0c;甚至数据库奔溃&#xff0c;而有效的定时备份能很好地保护数据库。本篇文章主要讲述了几种方法进行 MySQL 定时备份数据库。 一. mysqldump命令备份数据 在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工…