- 论坛徽章:
- 1
|
关于printf的奇怪用法
呵呵.这个问题我来解释一下吧.
首先看一段代码:
- #include <stdio.h>;
- int main()
- {
- int a[5]={1,2,3,4,5};
- printf("%d\n",3[a]);
- return 0;
- }
复制代码
在C语言中 其实数组的引用可以 3[a]这样的形式的. 等价于a[3];
再看下面一段代码:
- #include <stdio.h>;
- int main()
- {
- int a[5]={1,2,3,4,5},i=4;
- printf("%d\n",3[a]);
- printf("%d\n",i[a]);
- return 0;
- }
复制代码
这样的表示也是可以的 实际上相当与 i[a]实际上相当于a[4]了
再看下面一段代码:
- #include <stdio.h>;
- int main()
- {
- printf("%d\n",unix);
-
- return 0;
- }
复制代码
为什么我没有定义unix也能打印出来呢? 原因是unix 被编译器内定为一个 宏.
相当于#define unix 1 这样打印出来1
下面来解释一下这个问题.
- #include <stdio.h>;
- int main()
- {
- printf("%c\n",(unix)["have"]);
- return 0;
- }
复制代码
这里的unix相当于1 那么 unix["have"]相当于 "have"[1] 我们都知道"have"是个字符数组. 那么 "have"[1]就相当于引用这个"have"数组下标为1的字符了 实际上就是a;
- #include <stdio.h>;
- int main()
- {
- printf("0x%x",'a');
- return 0;
- }
复制代码
a的asc码的16进制表示为0x61.
(unix)["have"]+"fun"-0x60
中就相当于0x61-0x60+"fun"相当于 0x01+"fun" 相当于字符指针后移相当于"un"了
这样后面的部分解释完了。~
下面解释前面的. |
|