并不优雅

优雅的代码总是让人赏心悦目,比如下面有两段代码,都是实现了相同的功能,当你看完代码A再来看代码B时,你是否也有一种身心愉畅的感觉呢。

代码A:

//如果用户输入的是偶数,就直接输出,否则就+1之后再输出。

int a;

printf("请输入一个数字:");

fflush(stdin);

scanf("%d", &a);

//判断情况再输出

if (a % 2 == 0)

{

  printf("结果是:%d\n", a);

}

else

{

  a = a + 1;

  printf("结果是:%d\n", a);

}

代码B:

  //如果用户输入的是偶数,就直接输出,否则就+1之后再输出。

  int a;

  printf("请输入一个数字:");

  fflush(stdin);

  scanf("%d", &a);

  //输出结果

  printf("结果是:%d\n", a + a % 2);

让9行代码变成1行代码,却依然能实现相同的功能,有着四两拨千斤的味道,优雅感也就这么产生了。

然而,是否代码越少就越优雅呢?大部分情况下是的,但并不绝对,盲目的追求往往适得其反,最显而意见的例子就是下面这段代码。

  //请问以下代码会输出什么结果

  int a = 0;

  int i = 2;

  a = (++i) + (++i) + (++i);

  printf("%d\n", a);

其实今天主要就是想聊聊上面这段代码,不少企业的面试题中就经常会出现类似这样子的题目,我个人认为在面试题中出现这种题目的企业他们有着一个不负责任、不作为的人事部或者技术部。

为什么要考这种题目,我认为有三个原因:

1.在我们公司,这种代码被认为是优雅的、高效的代码,公司现有的程序中编写了此类代码,我们要求新加入的成员能阅读这种代码,甚至是在将来加入公司后,新成员也能写出这种代码。

2.在我们公司,我们认为这种浓缩代码是晦涩难懂的,所以并不优雅,或者说是伪优雅。虽然我们并不会在实际的项目中编写此类代码,也不会要求新员工在加入公司之后来编写此类代码,但我们依然将它加入到面试题中,因为我们希望新员工是一名技能好手,烂熟于胸的掌握操作符的优先顺序或许能一定程度上的说明部分问题。

3.在我们公司,面试题都是下载来的,或者历史遗留下来的,那种题目看起来就很高大上,可以显得我们公司也高大上,就留着吧。

遗憾的是,大部分企业是第三个原因吧。

代码变少,却依然能实现相同功能,自然是很棒。但真的依然能实现相同功能吗?经过试验发现,上面的这段代码,在不同的编译器下得到的结果是不同的。

  l 在VS2010中新建VC++控制台项目,运行的结果为:15

  先让三个++i执行,i就变成了5,然后5+5+5=15

  l 在VC++6.0中新建Win32控制台项目,运行的结果为:13

  为什么结果是13,我也没理解,求大神科普

  l 在VS2010中新建C#控制台项目,运行的结果为:12

  先++i就得到3,再++i就得到4,再++i就得到5

  然后3+4+5=12

在VC++6.0的时代,出现这种面试题,无可厚非。但时代在变化,当今还考(++i)+(++i)+(++i)就显得不太合适了,因为在不同的编译器下,将会得到不同的结果。

如果是因为第2个原因,想找技能好手而将此类题目加入面试题中,那这得是一个多么好的好手,才能准确的回答出此题呢?我想标准答案应该是这样的:“此题在VC++6.0中输出13;在VS2010中用C++输出15;用C#输出:12;”,然后再附上各种结果的计算过程。我想这种好手应该很少,如果真在面试题中加入这个题目,企业不但找不到顶尖好手,反而会错过很多一般般、还可以的好手。

如果是因为第1个原因,想找到能写出优雅代码的小伙伴,那就更加不靠谱了,因为首先,这种代码并不是优雅的,因为它根本没有“实现相同功能”,在不同编译器下结果是不同的。

结论:将代码浓缩的更少,却依然能实现相同的功能,大部分情况下这是优雅的做法,但要考虑两点,一是不能让代码变得特别晦涩难懂,二是要避免在不同编译器下出现不同的结果。

PS:或许有些偏题了,水平有限,不吝赐教。

时间: 2024-10-14 22:41:20

并不优雅的相关文章

.NET深入解析LINQ框架(一:LINQ优雅的前奏)

阅读目录: 1.LINQ简述 2.LINQ优雅前奏的音符 2.1.隐式类型 (由编辑器自动根据表达式推断出对象的最终类型) 2.2.对象初始化器 (简化了对象的创建及初始化的过程) 2.3.Lambda表达式 (对匿名方法的改进,加入了委托签名的类型推断并很好的与表达式树的结合) 2.4.扩展方法 (允许在不修改类型的内部代码的情况下为类型添加独立的行为) 2.5.匿名类型 (由对象初始化器推断得出的类型,该类型在编译后自动创建) 2.6.表达式目录树(用数据结构表示程序逻辑代码) 3.LINQ

.NET深入解析LINQ框架(二:LINQ优雅的前奏)

阅读目录: 1.LINQ框架的主要设计模型 1.1.链式设计模式 (以流水线般的链接方式设计系统逻辑) 1.2.链式查询方法(逐步加工查询表达式中的每一个工作点) 2.LINQ框架的核心设计原理 2.1.托管语言之上的语言(LINQ查询表达式) 2.2.托管语言构造的基础(LINQ依附通用接口与查询操作符对应的方法对接) 2.3.深入IEnumerable.IEnumerable<T>.Enumerable(LINQ to Object框架的入口) 2.4.深入IQueryable.IQuer

优雅的css写法

一.利用好代码折叠 css也可以进行优雅的代码折叠而且会比html更好看 折叠后的效果: 这样就可以很舒服的把它折叠起来. 二.向Twitter Bootstrap学习 1. 学习的第一点就是用class,去减少id.当然这是一个很基本的知识. 2. 学习的第二点是命名的词汇. 如group.control.banner.list.item,title.panel.content.container这些表结构和关系的词汇: 还有一些形容词danger.primary.lg.xs.info等等:

如何优雅的研究 RGSS3 (七) 添加LOGO画面

为游戏添加 LOGO 画面. 首先要设计 LOGO 场景类,我们知道场景类都是 Scene_Base 的子类. 我们来回顾一下场景的工作原理. 首先执行开始处理,接着是开始后处理,然后是不停的更新画面,最后结束前处理,然后结束处理. 下面来逐个分析这些方法. 当进入 LOGO 画面时,显然不需要也不可能回到上一个画面,因此在开始处理的方法中,我们要清空场景的切换记录. 接下来要创建出需要显示的 LOGO 图片,但是不能让它立即显示,而是要使其淡入画面,因此要冻结住图像的显示. 最后播放 LOGO

Atom:优雅迷人的编辑神器

对于热爱markdown写作的人来说,Atom同样是一款拥有无穷魅力的写作软件.我不怕它无法满足你的需求,就怕你不给一个机会了解它,那么,这将是一场遗憾的错过. 大学的时候,坊间对那些编程高手有一个令人向往的传说,大概说的是大神们能够直接使用text纯文本写代码.觉得这种级别的境界特别高大上特别有逼格.自己用eclipse,vs这些带有代码补全功能的IDE就感觉有点low.于是在很长一段时间里,都是带着信仰去追求这种境界的. 直到后来发现了一款神器,加上认知的慢慢提高,我的这个高大上的信仰,被打

少年,是时候换种更优雅的方式部署你的php代码了

让我们来回忆下上次你是怎么发布你的代码的: 1. 先把线上的代码用ftp备份下来 2. 上传修改了的文件 3. 测试一下功能是否正常 4. 网站500了,赶紧用备份替换回去 5. 替换错了/替换漏了 6. 一台服务器发布成功 7. 登录每一台执行一遍发布操作 8. 加班搞定 9. 老板发飙 ... 尤其现在的互联网行业,讲究快速迭代,小步快跑.像bug修复或者小功能的修改几乎每天都发版本,大功能的版本迭代每周也差不多会有一次.相信不少同行们像我上面说的这样发布自己的代码吧.或者可能先进一点,直接

如何优雅地使用Sublime Text

Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比于难于上手的Vim,浮肿沉重的Eclipse,VS,即便体积轻巧迅速启动的Editplus.Notepad++,在SublimeText面前大略显失色,无疑这款性感无比的编辑器是Coding和Writing最佳的选择,没有之一. 如何优雅地使用Sublime Text之目录: Sublime Text 2和3的对比 Sublime Tex

如何写出优雅的CSS代码 ?(转)

对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如何写出优雅的css代

渐进坚强、优雅降级

你能描述一下渐进增强和优雅降级之间的不同吗? 优雅降级和渐进增强印象中是随着css3流出来的一个概念.由于低级浏览器不支持css3,但css3的效果又太优秀不忍放弃,所以在高级浏览中使用css3而低级浏览器只保证最基本的功能.咋一看两个概念差不多,都是在关注不同浏览器下的不同体验,关键的区别是他们所侧重的内容,以及这种不同造成的工作流程的差异. 举个例子: a{    display: block;    width: 200px;    height: 100px;    background

Linux优雅使用哲学

Linux 的精髓在于它的命令行CLI (Command LIne) 和远程登录,我们要牢记,Linux 是作为一个服务器系统和嵌入式系统的价值而存在,而不是他的鸡肋桌面版.Linux 各种图形版桌面Xwindow 的发展有着先天的残缺,除非推倒重来,否则难以撼动 Windows 和 Mac OS 的地位.错误的 Linux 学习和使用方式会使新手疲于盲目折腾,难以领悟 Linux 的魅力,直至对 Linux 失去兴趣.Linux 使用哲学: 需求原则,一切以自身需求出发. 只使用各种发行版的命