C语言中 sizeof 运算的值是在编译时还是运行时确定?
2016-11-25 15:18
197 查看
在经典的《C语言程序设计》书中说到:
C语言提供了一个编译时(compile-time) 一元运算符 sizeof,它可以用来计算任一对象的长度。 表达式
sizeof 对象
以及
sizeof(类型名)
将返回一个整型值,它等于指定对象或类型占用的存储空间字节数。
显然,这里得到结论 sizeof 的值是在编译时确定的, 可是在C99标准前这是毫无疑问的,但是C99标准引入了动态数组,比如下列代码:
上述代码开始输入 3 给 n
输出结果为: 4 12 3
即sizeof(n++)中的++未执行,(在sizeof后使用函数,同样在求函数返回值大小时,函数也不会执行)
但sizeof(arr) 一定不是在编译时确定的。 不同的输入得到动态数组大小不一;
所以觉得:
在c99没有出现之前,sizeof是由编译时确定的,
sizeof对一个类型求出的值可以当一个常量来用。 但,c99中引入了动态数组(定义一个数组,其大小由运行时确定) 导致sizeof作用于动态数组时的值不再是常量。
ps: sizeof(‘a’)在C语言中的结果是4,在C++中结果是1,看过某篇文章说C中sizeof侧重于“数”,而C++中sizeof更侧重于“字符”。
两个用宏实现sizeof的经典应用
[code= cpp; title: ; notranslate prettyprint prettyprinted">[code]
C语言提供了一个编译时(compile-time) 一元运算符 sizeof,它可以用来计算任一对象的长度。 表达式
sizeof 对象
以及
sizeof(类型名)
将返回一个整型值,它等于指定对象或类型占用的存储空间字节数。
显然,这里得到结论 sizeof 的值是在编译时确定的, 可是在C99标准前这是毫无疑问的,但是C99标准引入了动态数组,比如下列代码:
// 需在C99标准的编译器下编译, ANSI C (即C89)下编译不通过 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int n; scanf("%d",&n); int arr[n]; printf("%d\n",sizeof(n++)); printf("%d\n",sizeof(arr)); printf("%d",n); return 0; }
上述代码开始输入 3 给 n
输出结果为: 4 12 3
即sizeof(n++)中的++未执行,(在sizeof后使用函数,同样在求函数返回值大小时,函数也不会执行)
但sizeof(arr) 一定不是在编译时确定的。 不同的输入得到动态数组大小不一;
所以觉得:
在c99没有出现之前,sizeof是由编译时确定的,
sizeof对一个类型求出的值可以当一个常量来用。 但,c99中引入了动态数组(定义一个数组,其大小由运行时确定) 导致sizeof作用于动态数组时的值不再是常量。
ps: sizeof(‘a’)在C语言中的结果是4,在C++中结果是1,看过某篇文章说C中sizeof侧重于“数”,而C++中sizeof更侧重于“字符”。
两个用宏实现sizeof的经典应用
[code= cpp; title: ; notranslate prettyprint prettyprinted">[code]
相关文章推荐
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定的?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- C语言中 sizeof 运算的值是在编译时还是运行时确定?
- 如何确定C#代码是在编译时执行还是在运行时执行
- Day01 - Xcode常用快捷键、高级语言源码的编译到运行、三码运算、基础类型所占字节与取值范围
- C语言编译四则运算
- 虚函数表是在编译的时候还是运行的时候产生的