有人可以解释一下这行代码是什么意思吗?

时间:2019-11-24 21:14:50

标签: c

我想知道这段代码的真正含义。我的意思是,我想知道它的作用,顺序和?:符号的含义;全部解释了。

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

谢谢。

3 个答案:

答案 0 :(得分:3)

  • 第一个参数“%c”表示printf需要打印出一个字符。
  • 第二个参数是函数打印的字符。
  • 在这种情况下,第二个参数是ternary operator。您可以阅读提供的链接,但总之,它基本上是if-else块的简写。这就是您的示例中的样子:

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

我们将其分为三个部分:

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

  2. '\n'

  3. pieces[board[sq] & 15]

第一部分是条件(如果);

  • 该表达式(sq & 8)使用所谓的按位AND运算(更多信息here)。基本上,二进制中的8是1000,该部分检查sq在该位置是否具有1(可以是1000、11000、101000等);如果是,则该表达式等于8(任何大于零的数字表示true),否则,则等于0(表示false)。
  • &&表示AND,仅表示左右表达式都必须为真
  • sq += 7将为sq添加7,如果不为0,则为true。

如果条件为真,则返回第二部分\n(在您的情况下,请打印出来);否则,第三部分将被打印出来(pieces[board[sq] & 15])。

答案 1 :(得分:1)

这是相当模糊的代码,因此最好尝试在它出现的上下文中理解它。通过以这种方式进行混淆,授权者试图告诉您“您实际上并不需要了解详细信息”。因此,让我们尝试从“自上而下”的内容(而不是自下而上的)推断上下文的细节来理解它的作用。

printf打印-在这种情况下为" %c“,它是一个空格和单个字符。单个字符要么是(来自?-:三元表达式)

  • 换行符'\ n'
  • 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)

好,谢谢大家!我已经看过了,它现在可以正常工作了。谢谢!