[置顶] 泰晓 RISC-V 实验箱,配套 30+ 讲嵌入式 Linux 系统开发公开课
[c-faq] 6.11-数组怪异写法
Wen Pingbo 创作于 2013/08/26
by PingboWen of TinyLab.org 2013/08/24
先来看一段代码:
int main(int argc, char *argv[])
{
printf("%c\n", 5["abcdssdc"]);
return 0;
}
你觉得这段程序会打印出什么? s ,确实是 s 。原因很简单,因为 s 是字符串 “abcdssdc” 的第 5 个字符。我们把这个程序转换一下:
int main(int argc, char *argv[])
{
char *tmp = "abcdssdc";
printf("%c\n", *(tmp+5));
return 0;
}
现在应该清楚了。这种奇怪的写法其实是利用了,在 C 语言中, ‘[]’ 操作符里外可以互换。一个数组表达式 “a[5]” ,可以写成 “5[a]” 。在编译器看来,这两种写法最后都会翻译成 “*(a+5)” 。更进一步,只要表达式 “x[y]” 中, x 和 y 可以进行加法运算,且运算后的结果可以正常作为一个地址被引用,那这种写法就是合法的,且编译器不会报任何错误。
但是,回过头来,这种写法在正常的程序中有用吗?个人感觉没有多大的实用价值,但是说不定会在 Obfuscated C Contest 中有用 :)
猜你喜欢:
- 我要投稿:发表原创技术文章,收获福利、挚友与行业影响力
- 知识星球:独家 Linux 实战经验与技巧,订阅「Linux知识星球」
- 视频频道:泰晓学院,B 站,发布各类 Linux 视频课
- 开源小店:欢迎光临泰晓科技自营店,购物支持泰晓原创
- 技术交流:Linux 用户技术交流微信群,联系微信号:tinylab
支付宝打赏 ¥9.68元 | 微信打赏 ¥1.00元 | |
请作者喝杯咖啡吧 |
Read Album:
- [c-faq] 3.8-未定义行为与sequence point
- [c-faq] 3.16-左值和右值
- [c-faq] 2.14, 2.15-offsetof和struct成员异类访问
- [c-faq] 2.10-designated initializer
- [c-faq] 1.25-隐式函数声明