关于c语言的一个小bug(c专家编程)
来源:互联网 发布:网络贷款不还会判刑么 编辑:程序博客网 时间:2024/06/06 17:01
不多说,说了都是累赘!直接看代码吧!
#include <stdio.h>int array[] = {23, 34, 12, 17, 204, 99, 16};#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))int main (void){ int d = -1, x; if( d <= (TOTAL_ELEMENTS -2)) { x = array[d+1]; printf("d <= TOTAL_ELEMENTS-2\n"); } else { printf("the bug is out!\n"); } return 0;}
有兴趣的可以先猜猜结果是啥,然后再运行下,看看结果是不是和自己想的一样? 其中的道理又是什么呢?
gcc 下如行结果如下:
zy@pc:~/workspace/homework/commonfunc$ ./a.out the bug is out!
TOTAL_ELEMENTS
所定义的值是unsigned int 类型(因为sizeof()返回类型是无符号的),if 语句在有符号和无符号之间测试相等性,所以将d升级为无符号(unsigned int )类型,-1转换成 unsigned int 的结果是一个非常巨大的正整数的,致使表达式为假,
所以要想结果正确,先得强转类型
if( d <= (int)(TOTAL_ELEMENTS -2))
这样就能得到正确的结果啦!对无符号的建议;
1 尽量不要在代码中使用无符号类型,以免增加不必要的复杂性,尤其是仅仅因为无符号数不存在负值而用它来表示
2 尽量使用int这样有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(-1 翻译成非常大的整数)
3 只有在使用位段和二进制掩码时,才使用无符号数。而且应该在表达式中使用强制类型转换,使操作数均为
有符号数或者无符号数,这样不必由编译器来选择结果的类型。
- 关于c语言的一个小bug(c专家编程)
- 关于C语言的一个小程序
- 关于C语言的一个小问题
- C 专家编程的一些小知识点
- 一个关于C语言编程的问题
- const 小启发 (C专家编程)
- 《C专家编程》学习笔记(这不是BUG,而是语言特性)
- 关于<C专家编程>的笔记
- 《C专家编程》:最庞大的实体类型-Bug(二)
- c语言专家编程,读书笔记
- c语言专家编程,读书笔记
- 《C专家编程》之C语言的声明
- C专家编程——分析C语言的声明
- C专家编程-分析C语言的声明
- C专家编程 十二 C语言的多维数组
- C语言里的符号重载《C专家编程》
- c 读文件的一个小bug
- 关于《c语言的一个小问题》的补充
- Python中利用reportlab将目录下所有的文本文件打印成pdf
- UBOOT移植详细 很全面
- hibernate面试题
- eclipse在ubuntu13.04下崩溃crash
- spring面试题
- 关于c语言的一个小bug(c专家编程)
- Uva 12585 Poker End Games 概率与期望
- 分页类代码实现
- hdu 1159 Palindrome(回文串) 动态规划
- Windons下读取两个文件中的信息,进行比对(附代码)
- hdu 2546 典型01背包
- java设计模式示例
- hdu 1081 矩阵最大连续子序列
- Populating Next Right Pointers in Each Node