C语言代码的简单优化

这里介绍的优化主要是让代码看起来更简洁明了

先看几个简单的例子:

<1>.输出 int 型数组a的元素个数

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

这里怎么填对我们来说非常简单了,我们一般用的32位机,所以直接写 sizeof(a)/4 就可以,开始这样代码就只适用于32位机,就降低了代码的移植性,所以可以改为 sizeof(a)/sizeof(int) ,让系统自行计算 int 类型占用空间。可如果改一下题目,输出数组a的元素个数呢?这时数组的元素类型不确定,但是数组每个元素的类型一定相同,因此只要写 sizeof(a)/sizeof(a[0]) 就可以了。

<2>.int 型数组a有n个元素,将数组从中间一分为二,输出数组后半段的起始下标

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

很容易可以想到数组元素个数有奇偶之分,那么可以这样填:(n%2==1)?(n/2+1):(n/2) 这样写当然没有错,只是有些繁琐,而且条件运算符的三个部分都要用括号括起来,否则会出现语法错误,这样的代码当然就不够好了。那么要怎么写?其实这类问题可以用数学知识来解决:n为奇数时后半段起始下标是 n/2+1,为偶数则是 n/2+0,n为奇数时加的1和n为偶数时加的0可以看成是他本身对2取余,所以可以填: n/2+(n%2)。好像还是不够好看,再想一下还可以怎么优化呢:一个奇数和比它小1的偶数除以2得到相同的数,那么如果n是奇数, n/2+1 和 (n+1)/2 等价,如果n是偶数, n/2+0 和 (n+1)/2 等价,于是这里可以这样填了: (n+1)/2。

再补充说一个小的点,在 (n%2==1)?(n/2+1):(n/2) 中 n%2==1 就等价于 n%2 ,它们的值是一样的,总结一下就是n==1等价于n,而n==0就等价于!n,这样写可以避免使用==号带来的容易错写成=赋值号造成答案错误的问题,提高了代码的安全性。

那如果一句代码是要判断两个数m与n相等或不等的关系呢?想一下,如果相等,那么m-n==0,于是判断相等用!(m-n),判断不等用(m-n)。

<3>.将数组a={10,20,30,40,50}输出k次

如k=3,输出:10 20 30 40 50 10 20 30 40 50 10 20 30 40 50

可以这样写:

for(int loop=0;loop<k;loop++) for(int i=0;i<5;i++) printf("%d ",a[i]);

这样的就是常规思想,用两层循环控制输出,这样时间复杂度就较高,影响程序运行的效率,那么其实可以这样写的:

for(int i=0;i<5*k;i++) printf("%d ",a[i%5]);这样就变成了一重循环啦,降低了时间复杂度而且也没有提高空间复杂度,代码效率自然就变高了。

<4>.用位移运算符代替乘除运算符,这样会快一点

例如 a=a*4 可以写成 a=a<<2 ,b=b/4 可以写成 b=b>>2。

注:按位左移n位相当于乘以2^n,右移相当于除以2^n。

避免不必要的整数除法:例如 s=a/b/c 改为 s=a/(b*c)。

还有一个有趣的小问题:不使用<,>,<=,>=运算符找到三个int型数据中的最小值

这个题的解法不止一种,下面是一例:

#include <stdio.h> #define min(x,y) (((a)-(b)) >> 31 ? (a) :(b)) int main() { int a,b,c,min; scanf("%d%d%d",&a,&b,&c); min=min(min(a,b),c); printf("min=%d\n",min); }

这段代码在函数首部进行了宏定义,通过位移运算判断(a-b)的正负,如果a-b为负,那么右移运算之后得到它的符号位也就是1,为正则得到0

这里要说一下关于宏定义,它完成的是简单的文本替换,必要时要给它每一部分加上括号避免程序运行结果出错,例如定义 #define N 2+3 在程序中如要计算N*N的值,就会是这样:N*N=2+3*2+3=11,而不是我们想要的25了。

还有一个好玩的位运算符是^,按位异或,用它可以实现交换两个数的值,而且效率最高

我们都知道有两种常见的方式实现交换:

第一种:t=a ; a=b ; b=t ;

第二种:a=a+b; b=a-b; a=a-b;

用按位异或来实现是这样的:a=a^b; b=b^a; a=a^b;

到这里分享结束,有不对的地方还请指教

c语言简单的代码优化相关推荐

  1. c语言 简单编程题,c语言简单编程练习题.doc

    c语言简单编程练习题 精品文档 2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE1 / NUMPAGES1 c语言简单编程练习题 然后输出相应的字符. #include #inc ...

  2. 主流WEB开发语言简单对比(转)

    主流WEB开发语言简单对比  原文链接:http://www.uml.org.cn/site/201401091.asp   随着时间的飞逝,随着岁月的流失.从世界上第一台计算机ENIAC诞生至今,已 ...

  3. c语言实现连续几个bit位置1,【C语言简单说】四:常量

    常量和变量是一种相对的概念,在这里我开始跟大家说说常量和变量的区别.可能前几节的小伙伴们并没有能感受出来,不过有了常量的对比那么将会有很好的理解. ..@_@|||||.. 头昏眼花 常量,就是一些固 ...

  4. PTA浙大版python程序设计题目集--第1章-3 输出“Python语言简单易学” (10 分)

    输入格式: 无 输出格式: 输出一句短语,Python语言简单易学. 如果包含汉字,用"print(s.encode("utf-8"))"输出. 如: s=&q ...

  5. JNI之C语言简单回顾

    JNI之C语言简单回顾 一.C语言基本数据类型:  c语言中  char, int, float, double, signed, unsigned, long, short and void // ...

  6. c语言表示测试结束,C语言简单测试题

    <C语言简单测试题>由会员分享,可在线阅读,更多相关<C语言简单测试题(12页珍藏版)>请在人人文库网上搜索. 1.1)C语言中下列叙述正确的是________.A)不能使用d ...

  7. 【C语言简单说】四:常量

    常量和变量是一种相对的概念,在这里我开始跟大家说说常量和变量的区别.可能前几节的小伙伴们并没有能感受出来,不过有了常量的对比那么将会有很好的理解. ..@_@|||||.. 头昏眼花 常量,就是一些固 ...

  8. c语言最简单的程序编写,C语言简单程序编写.doc

    C语言简单程序编写 项目一 C语言简单程序编写 1.1学习目标 本项目达到的目标为: 掌握程序设计的基本思路 掌握C语言的基本结构 了解流程图的符号含义 掌握C语言的关键字 会设计和编写简单的C应用程 ...

  9. c语言有啥简单的小程序,c语言-简单小程序-简单算法

    <c语言-简单小程序-简单算法>由会员分享,可在线阅读,更多相关<c语言-简单小程序-简单算法(19页珍藏版)>请在人人文库网上搜索. 1.以下小程序都在 TC2.0 中运行通 ...

最新文章

  1. bzoj3211,bzoj3038
  2. mysql 导入错误_mysql导入sql文件报错 ERROR 2013 2006 2002
  3. LLC算法coding与pooling解析
  4. tf报错之raise TypeError(“pred must not be a Python bool“)
  5. Spring对JNDI的支持方法
  6. Swift 里集合类型协议的关系
  7. Sublime Text 3安装GoSublime
  8. 中国区块链相关政策法规演变史
  9. MySQL出现Waiting for table metadata lock的场景浅析
  10. 积分上下限无穷_数分笔记——5种广义积分敛散性的基本方法
  11. 百战程序员python视频下载_[视频教程] 百战程序员python400集(第一季115集)
  12. 机器人识别抓取笔记(基于视觉的机器人抓取——从物体定位、物体姿态估计到平行抓取器抓取估计:综述)
  13. deepin 20 apt软件源
  14. Java中的statis用法
  15. 2019千股跌停情况是什么?千股跌停原因都有哪些?
  16. 技术网站 常用的技术网站
  17. 【开发必备】快来收藏!涵盖日常开发中所需要的60多个正则验证!!
  18. 测试学习-119-使用Excel做好看的报告图
  19. 上班拍抖音需谨慎!Tiktok「科技网红」因自拍泄密被苹果解雇
  20. ansible批量化脚本

热门文章

  1. 【深入理解Java虚拟机】保姆级整理汇总 第一部分:走近Java (一) Java技术体系
  2. CX8855/5V4A CC/CV DC-DC 同步降压 IC
  3. Camera V4L2 架构分析
  4. Solidify实现一个智能合约5(值类型和引用类型的传递)
  5. Android菜鸟历程2
  6. C++ 静态库和动态库 详解
  7. SDH与MDH参数法对比
  8. html盒子毛玻璃效果,css毛玻璃效果(外加background属性)
  9. NOSQL--LSM树
  10. Excel 2016 for Mac 数据分析在哪里