2016-05-31 37 views
-2

这是一个来自过去的论文的问题,我遇到了问题,问题和输出显示在下面,但我不明白这是如何实现的。有人可以请解释。解释这个循环的输出

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

当'b [i]'为0时,则'a [i] = b [i] '也是0,并且'!0'是真的,所以if语句的主体被执行。 – immibis

+0

什么部分你不明白? –

+0

我不明白我是如何得到输出的? – david98

回答

0

我想你需要知道的理解这段代码主要的是,由于任何一个分配到a[i](a[i] = b[i])将被评估,所以突破将终止您当i为3时,这是b[i]为0时的程序。粘贴的输出也支持此功能。

3

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

在你的情况下,(a[i] = b[i])将为零或非零,具体取决于b[i]。如果前者,!将其转换为真实值并且if正文运行(发生break)。如果是后者,你会从!中得到错误,并且循环继续运行。

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


(一)你应该知道,这是有效的,因为的b大小是隐式五(你不明确设置大小,但它与五行初始化)。 a的大小也是五,因为您将其大小指定为a[5],尽管您只明确将第一个元素初始化为1(其他元素已隐式初始化为零)。

+0

这是否意味着您可以输出'cout << x =(expression)<< endl;'并将其分配给'x'时输出表达式的值? –

+0

@JoelTrauger:差不多。我认为这种情况下,优先级会评估'(表达式)<< endl * * first *'并且抱怨试图用'endl'左移。你可以通过使用'cout <<(x =(expression))<< endl;'来修正这个优先级。 – paxdiablo

+0

可能值得做一个编辑,向OP解释'int a [5] = {1}'初始化'a'的原因,因为这是提前退出的原因,并且对于不熟悉的大括号初始值设定项。 – user4581301

0

首先,你必须了解C++的类型转换,基本上当转换为布尔类型0是假的(你可以从这里看到一个参考:c++ bool question

现在的程序做一个很简单的事情每次迭代在循环:

分配b[i]a[i]并尝试施放此INT布尔类型(隐式转换),看看它是否是假的真的,它打印整数,如果这是真的,打破循环ot herwise

因此,你可以看到为什么第3个整数被打印出来,因为他们被分配到a[i],被covnerted到布尔,并且事实证明,他们成了真正的(是的,真正的-1成了以及,当转换为布尔

第四号为0的所有非零整数会成真,和它相若方式被强制转换成布尔,成为假的!所以执行会打破循环,不再循环,不再打印。 (即使第五个数字不为零,因为已经执行离开循环,它将不会被打印)

+0

只是一个挑剔 - 我认为C++标准与C标准相似,因为该标注*总是*显式 - 隐式*“类型变形”的正确术语是转换。 – paxdiablo

+0

@paxdiablo谢谢,编辑。我一直在通过隐含的和明确的演员长时间地打电话给他们......每天我都会学习一些东西:) – shole