簡體   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