善用你的C(一)

原创 2004年06月16日 15:21:00

    上一篇文章写完之后感觉还算不错,因此我决定再写一些C的文章。
    C语言从出生到现在恐怕是寿命最长是用的人数最多的一种语言了。他以其简洁的语法和较高的执行效率讲过程语言带到了最高峰,然而在出现了面向对象语言之后C语言的地位受到了动摇,但他的执行速度仍然是无人能比的。
    针对这种情况有发展出了C++,他完全兼容C并且面向对象的功能强大,但这并不意味着C语言的历史使命就完成了。有一些程序还是要用C来写,最典型的就是Windows的API。
    其实在C中仍然具有一些面向对象的雏形,这些内容我会在后续的文章中提到,在本文中将讨论表达式的用法。和《java中的数据类型转换》一样,这篇文章的论题看似简单,但读过之后定会让你有不少的收获。
    只要是略懂编程的人都知道表达式是个什么玩艺儿,所以我就不多说了。在这里我要说的是一些表达式的非常巧妙的用法。
    首先,让我们来看看逻辑运算符&&和||。这两个运算符有一个非常有用的操作,那就是可以用来替代if语句。“什么?if语句跟那个有什么关系?”你也许会有这样的疑问,让我们来看一段程序:
#include <stdio.h>
void main()
{
 int a=5,b=45;
 a+b-50&&a++;
 printf("a=%d",a);
}这段代码的结果是:
a=5
从这里就可以看出a++并没有执行。这种操作称为“短路”,因为a+b-50等于0也就是false,这样a+b-50&&a++肯定就为false,C语言为了提高执行效率就不运算&&后面的表达式了。这就和if(a+b-50) a++;是一样的。||的原理和&&一样,它等价于if(!(a+b-50)) a++; 这个就不多说了。
    &和|这两个虽然是位运算符,但是他们也可以做为逻辑运算符来使用,来看一个例子:
#include <stdio.h>
void main()
{
 int a=1,b=0;
 if(a&b)
  printf("表达式为true");
 else
  printf("表达式为false");
}
结果为:
表达式为false
这说明a&b的值为和a&&b的效果是一样的,同样,a|b等价于a||b。过一会我再来解释为什么他们的效果是一样的。
    下面我们来讨论臭名昭著的goto语句。goto一直被规范化编程的支持者所唾骂的对象,但是他为什么还保留在C语言中呢?我们来看一个例子:
void main()
{
 int i,j,k,l;
 for(i=0;i<100;i++)
  for(j=0;j<i;j++)
   for(k=0;k<j;k++)
    for(l=0;l<k;l++)
     if(l==5)
      break;
}
在这里,break只能推出当前的这一层循环,如果想退出到最外层循环只能使用goto语句:
#include <stdio.h>
void main()
{
 int i,j,k,l;
 for(i=0;i<100;i++)
  for(j=0;j<i;j++)
   for(k=0;k<j;k++)
    for(l=0;l<k;l++)
     if(l==5)
      goto breakloop;
breakloop:
 printf("循环退出了");
 
}
这样就可以直接退出循环了。
    最后,我们来讨论一下位运算的技巧。
    数据是用二进制数来存储的,如果我们想知道单个数据的某一部分可以借助于位运算。比如我们想知道一个整数是正数还是负数只要取它的第一位就能辨别出来。要想知道一个浮点数小数点后面有几位也可以用这种方法。还有想某些地址也要取出某些位来实现重要功能。我们用一个例子来解释这种用法:
#include <stdio.h>
void main()
{
 int a=120,b=-2;
 if(a&0x80)//0x80转为二进制数是10000000,这样首位如果是0表达式就为0了
  printf("负数");
 else
  printf("正数");
 if(b&0x80)//如果首位是1那么他的结果就是非零数
  printf("负数");
 else
  printf("正数");
}
结果是:
正数负数
如果想取出第一位的数只要a&0x80>>7这样就可以了。
下面我们来解释一下前面那个&&和&为什么会等效。&&只要两边有一个为0那么整个表达式就为0,而&两边的任何一个数的所有位都为0(所有位都为0也就是0了)那么他的结果也是0。所以如果把表达式的结果做为逻辑条件的话就一定是等价的。
    这篇文章的主题就谈论完了,在下一篇文章我将介绍指针的用法。
                                2004.6.16

善用你的C(一)

  • zgqtxwd
  • zgqtxwd
  • 2008年04月27日 16:42
  • 156

善用你的C(二)

??? 前一篇文章讨论了表达式的用法,其中很多网友都指出最后一个例子有问题a&0x80这里面的a是16位。我当 时也是疏忽,不过细想起来如果a的取值范围在-127和127之间这样写是没有问题的,因为除...
  • chunhuizhao
  • chunhuizhao
  • 2004年07月01日 14:15
  • 1031

善领声音编辑器,修改search.dat完美启动静音

研究了好几天,总算把善领的search.dat文件格式Po了。 写了一个java程序,用来擦除善领启动音。程序比较简单,点击打开声音文件选择善领的search.dat文件,然后程序会自动解析文件格式...
  • feg545
  • feg545
  • 2016年03月19日 22:30
  • 1462

请回答1988-最后的德善旁白

岁月依然流逝 一切终将过去 年岁渐长 青春之所以美丽 恐怕这就是原因 在刹那的瞬间 耀眼闪烁之后 再也无法回去 双八年 我们双门洞的故事就此结束 怀念那个时期 怀念那个胡同 并不只是...
  • hgq_csdn
  • hgq_csdn
  • 2016年12月08日 18:59
  • 754

【西川善司的3D图形技术连载】GPU和Shader技术的基础知识(1~8回)

本连载的主要目的,是介绍最新的PC和GAME所使用的最新3D图形技术的发展趋势。 暂时的方针是,首先是考虑介绍比较新的PC Game和PS3,XBOX360等新时代游戏机的游戏所采用的技术。 ...
  • FancyVin
  • FancyVin
  • 2017年02月14日 01:22
  • 573

贵有恒,若事事勤思善问,何患不一日千里?--惭愧

想来备考已一月有余,踏实落地之物几无,何以至此,不恒,而后之时间,必争分秒,效率,练习思问,戒之,戒之。 曾国藩家训语录 勤字功夫,第一贵早起,第二贵有恒;凡将相无种,圣贤豪杰无种,只...
  • c_c123
  • c_c123
  • 2017年11月19日 10:00
  • 351

Android逆向工程实例 -- 善领安卓版DSA APP手势操作bug修复

善领官方网站发布的DSA软件(安卓版)及网络上流传的其他版本,均发现手势操作会导致进程崩溃的问题。查询相关网页信息都提出是官方软件本身的问题无法解决。         尝试使用逆向工程跟踪调试了一下...
  • u014183302
  • u014183302
  • 2014年11月19日 00:04
  • 3102

西川善司的3D图形技术概念和渲染管线的处理

from: http://psv.tgbus.com/news/ynzx/201305/20130528094843.shtml   3D图形技术概念和渲染管线的处理 一:3D图形的...
  • smsmn
  • smsmn
  • 2014年02月13日 13:33
  • 1234

天善智能网络爬虫学习~

#http://www.maoyan.com-榜单-top100,通过改变offset=10、20...这个参数实现翻页 #1、抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码...
  • yunini2
  • yunini2
  • 2017年07月10日 21:04
  • 137

朋友,请善待你的身体吧

最近,经常会听到朋友、同事,或者同学发出这样的感慨,“工作了之后胖了好多”,“最近老觉得头晕,颈椎难受”,等等。的确,生活节奏的加快,每个人在城市中扮演着不同的角色,工作压力也逐渐增大,很多时候不是不...
  • wu__di
  • wu__di
  • 2016年09月05日 00:14
  • 353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:善用你的C(一)
举报原因:
原因补充:

(最多只允许输入30个字)