解释这个循环的输出

时间:2016-05-31 00:56:03

标签: c++ if-statement for-loop

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

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

3 个答案:

答案 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个数字非零,因为执行已经离开循环,也不会打印)