这是过去一篇论文中我遇到问题的问题,问题和输出显示如下,但我不明白这是如何实现的。有人可以解释一下。
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
答案 0 :(得分:3)
循环最多运行五次,每次循环时,它会将b[i]
复制到a[i]
(a)。如果该副本导致将{0}放入a[i]
,则if
语句的条件将为真,并且循环将中断。这是因为表达式x = y
的结果是x
的最终值。
在您的情况下,(a[i] = b[i])
将为零或非零,具体取决于b[i]
。如果是前者,则!
将其转换为真值并且if
正文运行(break
发生)。如果是后者,则从!
得到错误,循环继续运行。
第四个元素发生了中断,这就是为什么你只看到三个输出行。
(a)你应该知道这是有效的,因为b
的大小是隐含的五(你没有明确地设置大小,但是它是&#39; s用五个元素初始化)。 a
的大小也是5,因为您使用a[5]
指定了它的大小,尽管事实上您只是将第一个元素显式初始化为1
(其他元素被隐式初始化为零)。 / p>
答案 1 :(得分:0)
我认为理解这段代码需要了解的主要事项是(a[i] = b[i])
将被评估为分配给a[i]
的任何内容,因此中断将终止您的程序当i
为3时,即b[i]
为0时。您粘贴的输出也支持此。
答案 2 :(得分:0)
首先你必须理解C ++中的类型转换,转换为布尔类型时基本上0是假的(你可以从这里看到引用:c++ bool question)
现在程序对循环中的每次迭代都做了一件非常简单的事情:
将
b[i]
分配给a[i]
并尝试将此 int 强制转换为布尔类型(隐式转换),并查看它是否为真false,如果为true则打印整数,否则打破循环
因此,您可以看到为什么打印出前3个整数,因为它们被分配给a[i]
,被连接到布尔,结果证明它们变为真(是的, - 1也变为真,当转换为布尔时,所有非零整数都将变为真。
第4个数字是0,并且类似地它被转换为布尔并且变为假!因此执行会突破循环,不再循环,不再打印。 (即使第5个数字非零,因为执行已经离开循环,也不会打印)