#include <stdio.h>
int main()
{
int a=3, b = 5;
printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
printf(&a["WHAT%c%c%c %c%c %c !\n"], 1["this"],
2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);
return 0;
}
这是我在课堂上给出的练习题之一。我试图弄清楚这段代码是如何获得输出的,这是
您好!这怎么样?超 那是C!
&amp; a [“%s”]操作。这是如何运作的?与seco一起
答案 0 :(得分:3)
代码
&a["Ya!Hello! how is this? %s\n"]
被解释为
&(a["Ya!Hello! how is this? %s\n"])
由于所有C风格的字符串都是指针,因此这是一个奇怪但合法的用法
arr[i]
和
i[arr]
在C中都是合法的。因此,代码应该被解释为
&("Ya!Hello! how is this? %s\n"[a])
自a = 3
以来,这就是角色H
。因为我们取这个字符的地址,所以这给出了一个指向C风格字符串的指针
"Hello! how is this? %s\n"
以此为起点,您可以尝试解码程序的其余部分。
希望这有帮助!
答案 1 :(得分:1)
首先,您必须了解字符串文字是char
个元素的数组。这意味着您可以像使用任何其他数组一样使用字符串文字。这是一个合法的C表达式
"hello"[i]
将评估字符串“hello”的i
字符。例如,"hello"[1]
可让您访问存储e
的字符。
其次,您必须了解合法a[i]
表达式a
和i
可以在不改变表达式含义的情况下进行交换。这意味着
i["hello"]
也是合法的,并且还允许您访问字符串“hello”的i
字符。因此,如果i
等于2,则i["hello"]
引用第一个l
。
现在,这已足以破译原始代码,假设您知道printf
是什么以及它是如何工作的。