解释这个循环的输出
Explain the output of this 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
循环最多运行五次,每次通过循环,它都会将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个数字为非零,由于执行已经离开循环,也不会打印)
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 而循环:简单的除法程序输出零,不明白为什么
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- 如何在 c++ 中使用 for 循环输出矢量中的所有对象
- 我将如何保存此 for 循环的输出
- 该程序没有产生输出,而是卡在一个循环中,几秒钟后消失并打印被杀死?
- 循环C++不同的输出
- 在控制台上输出我从文件中读取的整数,将程序插入无限循环
- 创建一个循环,该循环将输出大于零且小于 60(不包括 60)的所有 5 的倍数
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 当输出达到某个值时,如何在 c++ 中中断计数器循环
- 尝试使用嵌套的 for 循环进行某些输出
- 循环内控制台中的输入和输出
- while 循环中的流输出文件() 通常生成空文件
- C++,程序输出无效输入,但继续通过循环
- 当我在循环内打印变量时无限输出
- 如何水平排列程序的打印输出循环而不重复