[英]Could someone explain me what does this line of code mean?
我想知道這段代碼的真正含義是什么。 我的意思是,我想知道它做什么,按什么順序,做?
和:
符號的意思; 都解釋了。
printf(" %c", ((sq & 8) && (sq += 7)) ? '\n' : pieces[board[sq] & 15]);
謝謝。
在這種情況下,第二個參數是一個三元運算符。 您可以閱讀提供的鏈接,但簡而言之,它基本上是 if-else 塊的簡寫。 這就是您的示例中的樣子:
((sq & 8) && (sq += 7)) ? '\\n' : pieces[board[sq] & 15]
我們把它分成三個部分:
((sq & 8) && (sq += 7))
'\\n'
pieces[board[sq] & 15]
第一部分是條件(if);
(sq & 8)
使用所謂的按位 AND 運算(在此處閱讀更多內容)。 基本上,二進制中的 8 是 1000,該部分檢查 sq 在該位置是否為 1(可以是 1000、11000、101000 等); 如果是,則該表達式等於 8(任何大於零的數字都表示為真),如果不是,則等於 0(表示為假)。sq += 7
會將 7 加到 sq 上,如果它不是 0,則為 true。 如果條件為真,則返回第二部分\\n
(在您的情況下打印出來); 否則第三部分將被打印出來( pieces[board[sq] & 15]
)。
這是相當混亂的代碼,因此最好嘗試在它出現的上下文中理解它。 通過以這種方式混淆它,作者試圖告訴你“你真的不需要了解細節”。 因此,讓我們嘗試從“自上而下”推斷上下文的細節,而不是自下而上來理解它的作用。
printf
打印 - 在本例中為" %c
”,它是一個空格和一個字符。 單個字符將是(來自?
- :
三元表達式)
piece
從空間sq
上board
這將取決於之前的條件?
-- 它首先測試sq
的單個位( & 8
按位執行,並使用一個設置位的常量),如果設置了該位,則將 7 添加到sq
並打印換行符1 ,如果未設置,則打印換行符, 將打印該片段。
所以現在我們真的需要知道上下文。 這可能是在以sq = 0
開始並在循環中每次遞增sq
的循環中(即,類似於for (int sq = 0; ...some condition...; ++sq)
)。 所以它所做的是打印出棋盤某行上的碎片,當它到達該行的末尾時,打印一個換行符並繼續到下一行。 這在很大程度上取決於board
陣列的組織方式——它似乎是一個嵌入了 2D 板的 1D 陣列; 第一行在索引 0..7 處,第二行在索引 16..23 處,第三行在索引 32..39 處,以此類推2 。
從技術上講,當該位設置為1時,它會測試加 7 的結果,但除非sq
為 -7,否則這將是正確的,這在上下文中可能是不可能的(從 0 開始並且僅從那里遞增的循環)。
2這里的間隙是從代碼行中的測試推斷出來的——那些設置了第 3 位的索引(其中sq & 8
為真)不是有效的棋盤空間,而是行之間的“間隙”。 它們可能用於代碼中的其他地方
好的,謝謝大家! 我看過它,現在它按預期工作。 謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.