while循环实际上非常可怕。我从未在现实生活中见过这样的代码,并且会认为任何在现实生活中这样做的程序员都是疯子。我们需要逐步进行:
while (condition);
这里有一个带有空语句的while语句(仅一个";"的空语句)。条件被评估,如果为真,则执行该语句(因为空语句而不执行任何操作),然后我们重新开始。换句话说,条件将重复评估直到为假。
condition1 || condition2
这是一个“或”语句。首先评估第一个条件。如果它为真,则第二个条件不被评估,结果为“真”。如果它为假,则评估第二个条件,并相应地得到“真”或“假”的结果。
while (condition1 || condition2)
这段代码首先会评估第一个条件,如果它为真,则我们重新开始循环。如果为假,则我们评估第二个条件。如果第二个条件为真,则我们重新开始循环。如果两个条件都为假,则我们退出循环。请注意,只有在第一个条件为假时才会评估第二个条件。现在让我们看一下这些条件:
!*p1++
!*p2++
这与*(p1++) == 0和*(p2++) == 0相同。每个条件在评估后都会增加p1或p2,无论结果如何。如果*p1或*p2为零,则每个条件为真,否则为假。现在我们检查每次迭代发生的情况:
p1 = &t1 [0], p2 = &t2 [0]
*p1++ == 0 is true, *p2++ == 0 is never evaluated, p1 = &t1 [1], p2 = &t2 [0].
*p1++ == 0 is true, *p2++ == 0 is never evaluated, p1 = &t1 [2], p2 = &t2 [0].
*p1++ == 0 is false, *p2++ == 0 is true, p1 = &t1 [3], p2 = &t2 [1].
*p1++ == 0 is false, *p2++ == 0 is true, p1 = &t1 [4], p2 = &t2 [2].
*p1++ == 0 is false, *p2++ == 0 is false, p1 = &t1 [5], p2 = &t2 [3].
t1等同于&t1[0]。p1 - t1 == &t1[5] - &t1[0] == 5。
t2等同于&t2[0]。p2 - t2 == &t2[3] - &t2[0] == 3。
main
应该返回一个int
。一些系统期望当程序成功完成工作时,main
返回0
。当main
返回void
时,系统将尝试读取退出状态,得到的是垃圾值。 - GingerPlusPlus