简洁的c++循环-条件何时停止为真



如果这是一个错误的问题,我很抱歉。我在读Bjarne Stroustrup的书时发现了这种复制字符串的方法。我写了一个类似的代码来复制数组。

int arr1[5] = {1,2,3,4,5,};
int arr2[5] = {9,10,11,12,13};
int *a = arr1;
int *b = arr2;
// I deduce the original example (C++ book) was with strings, and it terminates because of 
while (*a++ = *b++) ;

我的问题是,这个代码正确吗?或者是未定义的行为,因为我没有检查数组的大小?如果它确实是正确的,那么while中的条件到底在什么时候为假?

编辑:对。我已经在其他地址(超出数组的大小)上打印了值,并且这些值正在被复制,直到b在内存中指向某个0。

while (*a++ = *b++) ;的工作原理如下:

  1. 执行*a++ = *b++

    1. 从变量b中读取内存地址

    2. 从该地址读取int

    3. 从变量a中读取内存地址

    4. 将int写入该地址

    5. int是答案

    6. 为变量a增加int

      的字节数
    7. 为变量b增加int

      的字节数
  2. 如果答案为0,停止循环

  3. 做什么
  4. 返回步骤1

你可以看到它一直在复制,直到它最后复制的是0

由于数组arr2中没有0,它继续读取arr2结束后的内存地址,并在arr1结束后写入内存地址,直到它碰巧找到0。这是未定义行为。

最新更新