【发布时间】:2018-03-17 22:49:08
【问题描述】:
前段时间,我的老老师发布了这段代码,说这是将数组初始化为相同数字(当然不是零)的另一种方法。
在这种情况下是三个。
他说这种方式比for循环稍微好一点。为什么我需要左移运算符?为什么我需要另一个长数组?
我不明白这里发生了什么。
int main() {
short int A[100];
long int v = 3;
v = (v << 16) + 3;
v = (v << 16) + 3;
v = (v << 16) + 3;
long *B = (long*)A;
for(int i=0; i<25; i++)
B[i] = v;
cout << endl;
print(A,100);
}
【问题讨论】:
-
我不知道为什么它应该稍微好一点,因为它似乎有未定义的行为。这应该是性能增强吗?
-
请注意,假设它没有首先溢出,v 以
0x3000000300000030000003L结尾。溢出只是这段代码的第一个问题——这位老师应该不在教 C++。 -
别担心,你的编译器也不理解它。如果该代码在具有特定编译器的特定机器上工作,那只是偶然。
-
这仍然使用 for 循环,它只是使用了一个较小的循环,有 25 次迭代而不是 100 次迭代。如果
sizeof(long)为 8,它可能会起作用。但它不会比标准方法快。 -
@CiaPan 仅仅因为 C++ sn-p 也是一个有效的 C sn-p,它不会自动使其成为 C 而不是 C++;在某些情况下,代码在两种语言中都有效,但在每种语言中都有不同的结果(例如,
sizeof('a')在 C 中是sizeof(int),但在 C++ 中是sizeof(char))。