神奇的C语言九:sizeof埋下的陷阱
2014-05-28 09:40
295 查看
1、sizeof不是一个函数,虽然长得跟个函数似的。
看下面的例子:
会输出4吗?输出的是3,显然++a没有被执行。
sizeof的括号里面的语句只会被在编译的时候计算一下类型,然后整个sizeof()返回的是这个类型的字节数,而不会对括号中的表达式生成代码。
这需要注意一下。
2、sizeof返回的是unsigned int类型的值。
举个例子:
程序本意是想打印出
3, 2, 1, 1, 2, 3,
不过遗憾的是什么都没有打印出来。如果您知道sizeof返回的是unsigned类型,并且 signed 和 unsigned 在进行比较运算的时候会先被转化为相同的 unsigned 类型,您就知道为什么了。
日后再使用 sizeof 时,您会更加谨慎的,不是吗?
看下面的例子:
int a = 3; if (sizeof(++a) == 4){ printf("%d\n", a); }
会输出4吗?输出的是3,显然++a没有被执行。
sizeof的括号里面的语句只会被在编译的时候计算一下类型,然后整个sizeof()返回的是这个类型的字节数,而不会对括号中的表达式生成代码。
这需要注意一下。
2、sizeof返回的是unsigned int类型的值。
举个例子:
int main(){ #define COUNT(array) (sizeof((array)) / sizeof((array)[0])) int a[] = {1, 2, 3}; int i; for (i = - COUNT(a) + 1; i < COUNT(a); ++i){ i = i < 0 ? -i: i; printf("%d ", i); } return 0; }
程序本意是想打印出
3, 2, 1, 1, 2, 3,
不过遗憾的是什么都没有打印出来。如果您知道sizeof返回的是unsigned类型,并且 signed 和 unsigned 在进行比较运算的时候会先被转化为相同的 unsigned 类型,您就知道为什么了。
日后再使用 sizeof 时,您会更加谨慎的,不是吗?
相关文章推荐
- C语言sizeof陷阱
- sizeof不是函数,C语言中sizeof的陷阱
- C语言变量类型隐式转换小陷阱
- C++ sizeof 使用规则及陷阱分析
- C语言:数据类型、存储区字节数、占位符、sizeof、输入输出、二进制相关、操作符(++,--)、主函数参数
- 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法
- c语言中的陷阱1
- 黑马程序员--c语言:scanf、sizeof、基本运算
- C\C++ sizeof 陷阱&&总结
- (转载)sizeof陷阱
- C语言的sizeof和strlen
- 解析C语言中的sizeof
- C++ sizeof 使用规则及陷阱分析
- 常问面试题:C++中sizeof的陷阱及应答
- malloc与sizeof的合用的陷阱
- C语言中的sizeof和strlen
- 详细解析C语言中的sizeof
- C语言sizeof函数和指针变量所占字节数
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- 除法如何舍入?--摘自《C语言陷阱和缺陷》