繁体   English   中英

std::cout 中的递归打印

[英]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有什么作用? 我对&&的直觉告诉我它应该等同于TRUEFALSE ,但是' '与布尔值有什么关系?

<<运算符(即使它为输出流重载并且不再是按位移位)比&&运算符具有 更高的优先级 因此,我们可以在您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM