Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45572
  • 博文数量: 5
  • 博客积分: 137
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-22 08:49
文章分类
文章存档

2011年(5)

分类: C/C++

2011-10-13 17:17:41

         最近在准备升本考试,在复习C语言时,发现几个以前忽略的问题,现在在回过头来看C语言去研究这些东西感觉挺有意思的,虽然国二考过了,但是在准备国二的过程中并没有像现在这样发现这么多小的知识,也许以前有很多东西还没吃透吧,但现在再去理解很多东西都觉得其实挺简单的,现在就跟大家分享一下:
1.进制转换
  '\xe0'表示的是十六进制,将他用十进制输出时,竟然出现了意想不到的结果,如果没在VC里运行单靠用笔来算的话,那么得到的结果是224,因为14*16=224,但是在VC里运行的结果却是-32,这是为什么呢,原来在计算机内部224以二进制形式存储的是11100000,最高位是1,那么计算机会认为是一个负数,而不是我们算得认为的224,既然是一个负数,那么计算机输出时就要以原码的形式输出,11100000的原码是10100000,他的十进制是32,别忘了他的最高位表示的是符号位,所以输出的就是-32了。这个结果如果仅靠笔算的话还真不好算,因为计算机毕竟不是人,他的算法规则是一定的,不管数怎么变他都按他的预设好的算法规则来。
2.自增自减
 ++、——问题一直是个问题,它牵扯到到底是先用还是先增,说白了,如果++、——在后面那么就先用,在后面就先增再用,但是有这种情况就是a=i+++i+++i++这种情况,那么就不像前面说的那么简单了,首先所有的++号都先不看,只算三个I值相加的结果,最后再将I值自增三次得到I值。如果是a=++j+++j+++j呢,那么就要考虑到+号的一个性质就是做结合性,首先将前两个j自增两次相加然后再和后面的自增三次后的j相加,才能得到结果。
   这是这几天看了题,做了题,改了题之后得到的以前不太明白的一点小心得!
阅读(9489) | 评论(25) | 转发(0) |
0

上一篇:sql小练习

下一篇:没有了

给主人留下些什么吧!~~

五岳之巅2011-10-14 21:59:03

pmerofc: a=i+++i+++i++
这种写法本身是错误的
因为C语言不容许同一个数据对象(变量)在两个相邻序点之间改变两次以上
但编译器通常并不报错
这种行为叫未定义行为(und.....
a=i+++i+++i++
这种写法实际编程时,当然不提倡。
但这种写法本身并不是错误的!
i  +   +   +  i,具体怎么算得看C语言计算符号的优先级和结合性,++比+优先级高(不论哪种编译器都高),+是左结合++又是右结合,写不写括号都是
(i  +   +)   +  i

五岳之巅2011-10-14 21:52:47

davelv: 老湿,其实我并不是不尊重教师,我也是教师家庭出身,但是既然从事教育工作这么多年,也教了这么多学生,不知道您有没有对这些所谓显而易见/广为传播的“真理”.....
看了你写的帖子,其实写的很好,而且非常深入。但问题是有些过于深入了,不同的编译器对这个问题的解释不一定一样,比如turboC和gcc似乎和VC就太一样(N年前的事了,以前试过)。
说白了,并没有那么复杂,编译器开发者早已认识到这个恼人的问题,所以进行了编译器优化,++a*++a就属于编译器优化,比如:a的初值是5
++a*++a*++a*++a,该怎么办,真的从左到右一步一步展开,别忘了(a=1)||(b=1),右边的是不会计算的,这些都是编译器优化。比如GCC是这么算的a前有几个++号,就先增加几个1,是5+4=9然后算乘9*9*9*9,你说的第一个结果就是这么算的。
如果++号在右,就先统统乘,然后在给变量加。
但如果又有左,又有右,就该算左先算

pmerofc2011-10-14 21:45:57

十年梦生: [root@bogon ~]# cat test.c
#include<stdio.h>

main(){
printf("%d\n",'\xe0');
}
[root@bogon ~]# gcc test.c
[root@bogon ~]# ./a.out
-3.....
根据运行结果判断代码是否正确是不懂C的标志

pmerofc2011-10-14 21:45:01

五岳之巅: 朱宝艳就是我的一个女学生,本来是做了专升本的习题解决问题,然后给自己做的笔记而已,而且写的很快很乱,只为自己看懂就是了。没想到被首页了,她肯定没有想挑.....
http://bbs.chinaunix.net/thread-1686753-1-1.html
http://bbs.chinaunix.net/thread-3565316-1-3.html
http://blog.ch

pmerofc2011-10-14 21:42:54

朱宝艳: 因为我也处于学习阶段,请指教。。。.....
a=i+++i+++i++
这种写法本身是错误的
因为C语言不容许同一个数据对象(变量)在两个相邻序点之间改变两次以上
但编译器通常并不报错
这种行为叫未定义行为(undefined behavior)
未定义行为不容许出现在代码中
未定义的行为可能是任何可能
其中一个可能恰好是你“乱猜”的
但你不能把“乱猜”当作正确