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