解释这个循环的输出

Explain the output of this loop

本文关键字:输出 循环 解释      更新时间:2023-10-16

这是我在过去的一篇论文中遇到的一个问题,问题和输出显示在下面,但我不明白这是如何实现的。有人能解释一下吗。

int main ()
{
int a[5] = { 1 }, b[] = { 3, -1, 2, 0, 4 };
for (int i = 0; i<5; i++)
{
if (!(a[i] = b[i])) // note: = not ==
break;
cout << a[i] << endl;
}
}

输出:

3
-1
2

循环最多运行五次,每次通过循环,它都会将b[i]复制到a[i](a)。如果该副本导致零被放入a[i],则if语句的条件将为true,循环将中断。这是因为表达式x = y的结果是x的最终值。

在您的情况下,(a[i] = b[i])将为零或非零,具体取决于b[i]。如果是前者,则!将其转换为真值,并运行if主体(发生break)。如果是后者,则从!得到false,循环将继续运行。

这种中断发生在第四个元素上,这就是为什么您只能看到三条输出线。


(a)您应该意识到这是有效的,因为b的大小隐式为五(您没有显式设置大小,但它是用五个元素初始化的)。a的大小也是5,因为您用a[5]指定了它的大小,尽管您只将第一个元素显式初始化为1(其他元素隐式初始化为零)。

我认为要理解这段代码,您需要知道的主要内容是,(a[i] = b[i])将被评估为分配给a[i]的任何值,因此当i为3时,即当b[i]为0时,中断将终止您的程序。粘贴的输出也支持这一点。

首先你必须了解C++中的类型转换,基本上0在转换为布尔类型时是错误的(你可以从这里看到一个参考:C++布尔问题)

现在,程序为循环中的每次迭代做一件非常简单的事情:

b[i]分配给a[i],并尝试将此int强制转换为boolean类型(隐式转换),并查看它是true还是false,如果它是true,则打印整数,否则中断循环

因此,您可以看到为什么前3个整数被打印出来,因为它们被分配给a[i],被转换为布尔值,结果它们变为真(是的,-1也变为真,所有非零整数在转换为布尔值时都变为真)

第4个数字是0,类似地,它被强制转换为布尔值并变为false!所以执行中断了循环,不再循环,不再打印。(即使第5个数字为非零,由于执行已经离开循环,也不会打印)