2

我有一个要初始化的数组

char arr[sizeof(int)];

这个表达式会计算为编译时间常数还是导致函数调用?

4

5 回答 5

4
char arr[sizeof(int)];

就语言而言,这很好,虽然数组只被声明(和定义),但如果它是一个局部变量,它就不会被初始化。如果它是在命名空间级别声明的,那么它是静态零初始化的。

注意sizeof(int)是类型的常量表达式size_t;它的值在编译时是已知的。

于 2013-08-08T15:12:56.753 回答
0

这实际上取决于您打算如何使用该数组。

sizeof(int)可能因不同的实现而异,因此您只需要注意如何访问数组中的元素。不要假设在您的机器上可访问的元素可在另一台机器上访问,除非它在 ​​C++ 标准中指定的最小尺寸范围内。

于 2013-08-08T15:17:24.080 回答
0

sizeof在编译时评估,唯一一次 sizeof 将是运行时评估的情况是代码中的可变长度数组C99gcc或支持VLA作为扩展的其他 c++ 编译器。所以这段代码是有效的:

char arr[sizeof(int)];

虽然如果它是局部变量,它不会被初始化。

于 2013-08-08T15:23:05.830 回答
0

这里没有初始化。声明或定义包含元素的数组并没有错sizeof(int),只是代码的读者可能会觉得有点奇怪。但如果这是你需要的,那就是你应该写的。

于 2013-08-08T15:12:22.893 回答
0

这是一个初始化:

  char arr[sizeof(int)] = { 'A', 'B', '0', 'F' };

这当然假设sizeof(int)是(至少)4,否则它将无法编译。

并回答实际(新)问题:

sizeof()是编译时运算符。在 C++ 中[根据标准,一些编译器确实允许 C 风格的可变长度数组],除了编译时间常数之外不会产生任何结果。在 C 中,使用可变长度数组,它可以变成一个简单的计算(元素的数量 * 每个元素的大小 - 其中元素的数量是可变部分)。

于 2013-08-08T15:14:22.143 回答