当前位置: 首页 > 知识库问答 >
问题:

以下表达式的输出是什么?为什么?

洪知
2023-03-14
printf(&unix["\021C%set"],(unix)["Chb"]+"Trick"-0X67);

它给出的输出为“cricket”。但我不明白为什么?http://ideone.com/fteahg

共有1个答案

常心水
2023-03-14

UNIX是一个预定义的宏,指示它是一个类似UNIX的系统。

在C语言中,index[array]array[index]相同。正如MSDN所解释的:

通常,postfix-expression表示的值是一个指针值,如数组标识符,而expression是一个整数值(包括枚举类型)。然而,在语法上所需要的只是其中一个表达式是指针类型的,而另一个是整型的。因此,整数值可以在表达式后缀位置,指针值可以在表达式或下标位置的括号中。

printf(&unix["\021C%set"],(unix)["Chb"]+"Trick"-0X67);

转换为

printf(&"(\021C%set"[1]),"Chb"[1]+"Trick"-0X67);

&(“\021C%set”[1])取“\021C%set”第一个元素的地址,相当于取“C%set”的地址(由于C指针算术)。简化它,并重新排列一些操作数:

printf("C%set","Trick"+"Chb"[1]-0X67);

“chb”[1]'h',它是ASCII值0x68,因此“chb”[1]-0x67是1,而“trick”+1“rick”(由于C指针算术)。因此代码进一步简化为

printf("C%set","rick");

上面印着“蟋蟀”

 类似资料:
  • 表达式--a^b^c^d。 什么将是它的后缀表达式。 如果遇到具有从右到左关联性的运算符,我们该怎么办?我们是将其推入堆栈还是将其弹出?

  • 我不明白为什么< code>gcc -S -m32会产生这些特定的代码行: C 代码: 它给出以下输出:

  • 当我跑的时候 我在Java中得到错误。为什么?这相当于false==false,这是真的。这不是Java特有的,我在其他语言中也得到了相同的结果。这是因为短路评估吗?似乎左右双方仍会/应该进行比较。

  • 问题内容: 以下代码是众所周知的将重音符转换为纯文本的代码: 我用这种方法代替了“手工制作”方法,但是我需要了解replaceAll的“ regex”部分 1)什么是“ InCombiningDiacriticalMarks”? 2)它的文档在哪里?(和类似的?) 谢谢。 问题答案: 是Unicode块属性。在JDK7中,您将可以使用两部分表示法来编写它,这对于读者来说可能更清楚。它在UAX#44

  • 本文向大家介绍python 什么是lambda表达式?它有什么好处?相关面试题,主要包含被问及python 什么是lambda表达式?它有什么好处?时的应答技巧和注意事项,需要的朋友参考一下 简单来说,lambda表达式通常是当你需要使用一个函数,但是又不想费脑命名一个函数的时候使用,也就是通常所说的匿名函数