编译器vs.代码 谁之过

摘要:编译器是将程序语言编译成机器语言的一种高级程序。如今许多编译器越发智能,在编译不通过的情况,你的代码甚至都无法运行,那么到底是编译的问题还是您的代码问题呢?

许多程序员喜欢抱怨编译器报出的各做错误,难道真的是编译器问题吗?下面就让我们来谈谈吧!

你确定吗?

当程序员告诉你,编译器会产生错误,请问你会信吗?99%的情况下,你会把它当作一个谎言或者是笑话,甚至在内心会嘲笑这个程序员。

通常编译报的错主要有以下几种:

  • 数组溢出
  • 变量没有初始化
  • 输出错误
  • 同步错误
  • 非法使用变量
  • 调用未定义方法或其它
  • 等等

对编译器报出的这些错误你是否早已如数家珍,但这并没有阻止程序员一次次对编译器的指责与抱怨。似乎这一切都是编译器的错!

编译器也可能包含错误,但是这种机率真的很小,除非你使用一些稀奇古怪的编译器。在我多年使用Visual C++的职业生涯中,我只看到一次汇编代码生成错误。

建议

当你在开始抱怨前,首先检查一下自己的代码是否有错并且已更正,其次,最好看看别的程序员是如何评价这个错误的。

目的

先奉上一段编译代码供大家娱乐一下:

  1. TprintPrefs::TprintPrefs(IffdshowBase *Ideci,  
  2.                          const TfontSettings *IfontSettings)  
  3. {  
  4.   memset(this, 0, sizeof(this)); // This doesn't seem to  
  5.                                  // help after optimization.  
  6.   dx = dy = 0;  
  7.   isOSD = false;  
  8.   xpos = ypos = 0;  
  9.   align = 0;  
  10.   linespacing = 0;  
  11.   sizeDx = 0;  
  12.   sizeDy = 0;  
  13.   ...  

我可以想象程序员看到这段注释会有多愤怒,多令人讨厌的编译器!在调试版本阶段,所有变量都被赋0值。由于优化问题,在发布版本中会包含一些垃圾。面对这种情况,最好的解决之道便是检查代码,而作为程序员,你还需继续编写代码,用勇气战胜邪恶!

下面让我们来分析上面这段代码,你发现没?memset()函数不工作的原因仅仅是因为一个非常简单的错误:第三个参数是计算指针的大小而不是计算结果的尺寸。正确的调用应该是:“memset(this,0,sizeof(*this));”

顺便说一句,函数memcpy()函数的效率也非常低。我确信,程序员肯定会说编译器开发商真迂腐。

  1. void Assign(const AVSValue* src, bool init) {  
  2.   if (src->IsClip() && src->clip)  
  3.     src->clip->AddRef();  
  4.   if (!init && IsClip() && clip)  
  5.     clip->Release();  
  6.   // make sure this copies the whole struct!  
  7.   //((__int32*)this)[0] = ((__int32*)src)[0];  
  8.   //((__int32*)this)[1] = ((__int32*)src)[1];  
  9.   memcpy(this,src,sizeof(this));  

从注释中可以明白这段代码试图从其他方法中拷贝内存。然而,编写这段代码的程序员试图丢弃使用memcpy()方法。当程序员想要复制的结构体正好是8字节的时候,在64位系统里面正好可以运行。

通过上面的分析大家可以明白,抱怨与指责编译器(制造商)是无法解决任何问题的,只会浪费时间,无法静下心继续编写代码。还是好好 检查一下你们自己的代码吧!此外,工具是死的,人是活的,程序员们,你们才是 工具的主人!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 在 Google 开发者大会上发布了哪些更新? | Google 开发者大会 2018

有哪些新的 Android 系统特性 Google Play 上的 targetVersion 要求 2018年8月 新应用发布必须为26或者更高2018年11月 升级现有应用必须为26或者更高2019年之后 新发布或者升级应用必须为一年内发布的 Android 版本工信部已经出台相应的政策,中国主流的应用市场也已…

两个不同的数据库如何跨库事务

首先我们要明白同一实例,简单来说就是一个ip,如果两个数据库位于同一个ip,就是同一实例。其实实例并不相当于ip, 他其实相当于服务,也就是serve。 这样的两个或多个就可以跨库事务,比如 begin; insert in…

链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)

参考http://www.cnblogs.com/TenosDoIt/p/3666585.html 插入排序(算法中是直接交换节点,时间复杂度O(n^2),空间复杂度O(1)) 1 class Solution {2 public:3 ListNode *insertionSortList(Lis…

zookeeper使用和原理探究

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 zookeeper介绍 zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据…

thinkphp如何部署到宝塔面板nginx服务器

原理:一般本地都会使用apache服务器,这个对pathinfo(两个,一个是环境变量$_SERVER[PATH_INFO],另一个是pathinfo函数)路由解析非常支持的,不需要部署什么, 但是nginx是对pathinfo函…

Android获取所有应用的资源id和对应的uri

背景在某些应用中,为了实现应用apk资源放入重复利用,或者使用反射得到本应用的资源,需要使用反射方式获得,但Resources类中也自带了这种获取方式,并且功能更加强大你可以获取string,color,drawable,raw,xml等文件&…

nginx的脚本引擎(一)

nginx的脚本的语法和shell是很像的,我大致看了一下觉得挺有意思的,就想写写记录一下。我没看过shell脚本的引擎,不知道nginx脚本引擎和shell脚本引擎像不像,但是我觉得nginx的脚本引擎有点像C和汇编。 ngx_http_script_engine_t这…

一个待办事列表todolist

最近有位老师让我做的,图片在下面,做了4个多小时,ui有的简陋,可以再美化一下,这个会更好看,毕竟我也不是专业前端,测试网站http://todolist.sshouxin.top/使用的是thinkphp5.1的框架&#xff0c…

详细说明 SourceTree 免登录,跳过初始设置的方法(Windows 版 )

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 首先,安装完 SourceTree 以后先运行一次,弹出初始化登录页面后退出。 2. 进入这个文件夹:C:\Users…

什么是好的API设计?

摘要:有人言,API设计是编程工作中最难的事情。甚至有人认为至少要有10年的工作经验才能接触它。不过这里提出了一个引人思考的问题:究竟是构建什么样的库需要花费10年的时间去学习? 有人言,API设计是编程工作中最难的事…

Linux学习记录-文件、目录与磁盘

用户和群组 用户和群组主要是为了区分用户对文件的操作权限。 账号在/etc/passwd个人密码在/etc/shadow组信息在/etc/group 不要乱动这3个文件文件权限和目录配置 文件属性 文件前缀解释,例如: 第一个字符代表这个文件是『目录、文件或链接文件等等』&am…

php curl模拟https请求

https请求(支持GET和POST) function http_request($url,$data null){$curl curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if(!empty($data)){curl_setopt($cur…

springboot集成环信sdk报错

import io.swagger.client.ApiException; import io.swagger.client.api.MessagesApi; import io.swagger.client.model.Msg 这个是因为少两个包,只需要把在你的pom.xml添加以下代码即可,不要忘记点赞哈只需要添加两个包即可,你可以自行网上下…

解决 error: Your local changes to the following files would be overwritten by merge:XXXX

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 idea 上将本地代码推送到 git后 , 报错如下图 error: Your local changes to the following files would be overwritten by merge:src/…

深度有趣 | 30 快速图像风格迁移

简介 使用TensorFlow实现快速图像风格迁移(Fast Neural Style Transfer) 原理 在之前介绍的图像风格迁移中,我们根据内容图片和风格图片优化输入图片,使得内容损失函数和风格损失函数尽可能小 和DeepDream一样,属于网络…

转型从思维习惯的转变开始

摘要:首先建议大家不要轻易转向管理岗位,要认清自己是否适合做管理。转型过程中应把握好几点:良好的技术基础,它是赢得团队信任的前提,是把握团队整体方向的关键;培养大局观,只有站得高才能看得…

数据库小知识点(一直更新)

一、mysql查询是否含有某字段: mysql数据库查询带有某个字段的所有表名 SELECT * FROM information_schema.columns WHERE column_namecolumn_name; oracle数据库查询带有某个字段的所有表名 select column_name,table_name,from user_tab_columns where column_n…

其他运算符

原文地址:https://wangdoc.com/javascript/ void运算符 void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 void 0 // undefined void(0) // undefined 上面是void运算符的两种写法,都正确。建议采用后一…

git pull --rebase 做了什么? 以及 Cannot rebase: You have unstaged changes 解决办法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 最近刚学 git rebase,觉得很牛逼的样子, 结果今天就被打脸了。 git pull --rebase 1 报错: Cann…

vue如何实现单页缓存方案分析

实现全站的页面缓存,前进刷新,返回走缓存,并且能记住上一页的滚动位置,参考了很多技术实现,github上的导航组件实现的原理要么使用的keep-alive,要么参考了keep-alive的源码,但是只用keep-alive…