繁体   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