我有一个要初始化的数组
char arr[sizeof(int)];
这个表达式会计算为编译时间常数还是导致函数调用?
char arr[sizeof(int)];
就语言而言,这很好,虽然数组只被声明(和定义),但如果它是一个局部变量,它就不会被初始化。如果它是在命名空间级别声明的,那么它是静态零初始化的。
注意sizeof(int)
是类型的常量表达式size_t
;它的值在编译时是已知的。
这实际上取决于您打算如何使用该数组。
sizeof(int)
可能因不同的实现而异,因此您只需要注意如何访问数组中的元素。不要假设在您的机器上可访问的元素可在另一台机器上访问,除非它在 C++ 标准中指定的最小尺寸范围内。
这里没有初始化。声明或定义包含元素的数组并没有错sizeof(int)
,只是代码的读者可能会觉得有点奇怪。但如果这是你需要的,那就是你应该写的。
这是一个初始化:
char arr[sizeof(int)] = { 'A', 'B', '0', 'F' };
这当然假设sizeof(int)
是(至少)4,否则它将无法编译。
并回答实际(新)问题:
sizeof()
是编译时运算符。在 C++ 中[根据标准,一些编译器确实允许 C 风格的可变长度数组],除了编译时间常数之外不会产生任何结果。在 C 中,使用可变长度数组,它可以变成一个简单的计算(元素的数量 * 每个元素的大小 - 其中元素的数量是可变部分)。