[英]Recursive print within std::cout
输入是 N 个间隔整数。 您必须阅读输入并向后打印输入。 来源:( https://www.hackerrank.com/challenges/arrays-introduction/problem?isFullScreen=false )
解决方案之一是:
#include <iostream>
int main() {
int N,i=0;
std::cin>>N;
int *A = new int[N];
while(std::cin>>A[i++]);
// We have now iterated through the input and stored the
// integers in a dynamically allocated array.
// This line apparently prints out the Array (size N) backwards.
while(std::cout<<A[--N]<<' ' && N);
delete[] A;
return 0;
}
while(std::cout<<A[--N]<<' ' && N);
向后打印出数组 A?
它如何知道停止运行 while 循环?
表达式' ' && N
有什么作用? 我对&&
的直觉告诉我它应该等同于TRUE
或FALSE
,但是' '
与布尔值有什么关系?
<<
运算符(即使它为输出流重载并且不再是按位移位)比&&
运算符具有 更高的优先级。 因此,我们可以在您的while
语句中添加括号以使其更清晰:
while ( (std::cout << A[--N] << ' ') && N )
;
添加的括号内的表达式将在每个循环中减少N
的值(因此,在第一个循环中,它将减少到原始值 - 1 - 这是分配数组的最后一个元素的索引),输出该索引处的整数元素,然后输出一个空格。 该“链接”操作的结果将是对std::cout
的引用; 有一个operator bool()
,如果输出成功则返回true
,如果输出失败则返回false
(不太可能,在给定的代码中)。 然后将该(可能)真值与将N
转换为布尔值的结果相结合——该转换将产生true1 for an non-zero value and
true1 和零的 false`......所以当索引减少到时循环将停止零(引用数组的第一个元素)。
当N
达到零时,我们不再需要运行(空)循环,因为输出已经由&&
运算符左侧的表达式执行。
使用括号更容易理解该语句:
while((std::cout << A[--N] << ' ') && N);
空格字符' '
被馈送到std::cout
流,与逻辑运算符&&
无关。 一元运算符--
将在对它进行任何访问之前递减 N。 当 N 达到 0 时,循环将停止,这将使&&
逻辑运算评估为 false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.