我想知道这段代码的真正含义。我的意思是,我想知道它的作用,顺序和?
和:
符号的含义;全部解释了。
printf(" %c", ((sq & 8) && (sq += 7)) ? '\n' : pieces[board[sq] & 15]);
谢谢。
答案 0 :(得分:3)
在这种情况下,第二个参数是ternary operator。您可以阅读提供的链接,但总之,它基本上是if-else块的简写。这就是您的示例中的样子:
((sq & 8) && (sq += 7)) ? '\n' : pieces[board[sq] & 15]
我们将其分为三个部分:
((sq & 8) && (sq += 7))
'\n'
pieces[board[sq] & 15]
第一部分是条件(如果);
(sq & 8)
使用所谓的按位AND运算(更多信息here)。基本上,二进制中的8是1000,该部分检查sq在该位置是否具有1(可以是1000、11000、101000等);如果是,则该表达式等于8(任何大于零的数字表示true),否则,则等于0(表示false)。sq += 7
将为sq添加7,如果不为0,则为true。如果条件为真,则返回第二部分\n
(在您的情况下,请打印出来);否则,第三部分将被打印出来(pieces[board[sq] & 15]
)。
答案 1 :(得分:1)
这是相当模糊的代码,因此最好尝试在它出现的上下文中理解它。通过以这种方式进行混淆,授权者试图告诉您“您实际上并不需要了解详细信息”。因此,让我们尝试从“自上而下”的内容(而不是自下而上的)推断上下文的细节来理解它的作用。
printf
打印-在这种情况下为" %c
“,它是一个空格和单个字符。单个字符要么是(来自?
-:
三元表达式)
piece
上空间sq
中的board
这取决于?
之前的条件-它首先测试sq
的单个位(& 8
进行按位运算,并带有一个置位的常数),如果该位置1,则将7加到sq
并打印换行符 1 ,如果未设置,将打印该行。
所以现在我们真的需要了解上下文。这是可能,该循环以sq = 0
开头,并在循环中每次递增sq
(即类似for (int sq = 0; ...some condition...; ++sq)
)。因此,它正在做的是在电路板上的某一行上打印出各个部分,并在到达该行的末尾时,打印换行符并继续到下一行。这在很大程度上取决于board
阵列的组织方式-似乎是一个内嵌2D板的1D阵列;第一行在索引0..7,第二行在索引16..23,第三行在索引32..39,依此类推 2 。
1 从技术上讲,当该位置1时,它将测试加法7的结果,但是除非sq
为-7,否则这是正确的,这可能是不可能的。上下文(从0开始并仅从那里开始递增的循环)。
2 此处的差距是根据代码行中的测试推断出来的-设置了3位(对于sq & 8
为真的那些索引)无效木板空间,但在行之间是“间隙”。它们可能会用于代码中其他地方的其他东西
答案 2 :(得分:0)
好,谢谢大家!我已经看过了,它现在可以正常工作了。谢谢!