[英]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.