簡體   English   中英

有人能解釋一下這行代碼是什么意思嗎?

[英]Could someone explain me what does this line of code mean?

我想知道這段代碼的真正含義是什么。 我的意思是,我想知道它做什么,按什么順序,做? :符號的意思; 都解釋了。

printf(" %c", ((sq & 8) && (sq += 7)) ? '\n' : pieces[board[sq] & 15]);

謝謝。

  • 第一個參數“%c”表示 printf 需要打印出一個字符。
  • 第二個參數是函數打印的字符。
  • 在這種情況下,第二個參數是一個三元運算符 您可以閱讀提供的鏈接,但簡而言之,它基本上是 if-else 塊的簡寫。 這就是您的示例中的樣子:

     ((sq & 8) && (sq += 7)) ? '\\n' : pieces[board[sq] & 15]

我們把它分成三個部分:

  1. ((sq & 8) && (sq += 7))

  2. '\\n'

  3. pieces[board[sq] & 15]

第一部分是條件(if);

  • 此表達式(sq & 8)使用所謂的按位 AND 運算(在此處閱讀更多內容)。 基本上,二進制中的 8 是 1000,該部分檢查 sq 在該位置是否為 1(可以是 1000、11000、101000 等); 如果是,則該表達式等於 8(任何大於零的數字都表示為真),如果不是,則等於 0(表示為假)。
  • && 表示 AND,它只是表示左右表達式都需要為真
  • sq += 7會將 7 加到 sq 上,如果它不是 0,則為 true。

如果條件為真,則返回第二部分\\n (在您的情況下打印出來); 否則第三部分將被打印出來( pieces[board[sq] & 15] )。

這是相當混亂的代碼,因此最好嘗試在它出現的上下文中理解它。 通過以這種方式混淆它,作者試圖告訴你“你真的不需要了解細節”。 因此,讓我們嘗試從“自上而下”推斷上下文的細節,而不是自下而上來理解它的作用。

printf打印 - 在本例中為" %c ”,它是一個空格和一個字符。 單個字符將是(來自? - :三元表達式)

  • 換行符 '\\n'
  • 一個piece從空間sqboard

這將取決於之前的條件? -- 它首先測試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為真)不是有效的棋盤空間,而是行之間的“間隙”。 它們可能用於代碼中的其他地方

%c格式說明符 ,表示將其理解為字符

(expr) ? a : b (expr) ? a : b條件運算符 ,表示以下內容,如果exprtrue則執行a ,否則執行b

&&邏輯AND運算符

&這是按位AND運算符

好的,謝謝大家! 我看過它,現在它按預期工作。 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM