#include
int main()
{
unsigned char result = 1["night"]*2["girls"]+4["allnight"];
char *of_you = "Though you was strong enough and seem never died";
printf("You got %s", result+of_you);
return 0;
}
| 1["night"]就是*("night"+1),也就是'i',ascii码为105 类似,2["multis"]是'l'(114) 4["allnight"]是'i'(105) result=(105*114+105)%256=43 result+of_you=43+"Though you was strong enough and seem never died" 指向第43个字符 |
这是个比较令人郁闷的宏,我初一看曾质疑过C里面有这种写法么?呵呵,说实话还真有,C里面数组还真有这样的写法,只不过平时我们很少用过罢了。
回想一下,例如数组,a[b], 其中 a为基址, [] 里面的b为偏移量。数组里的元素就是靠 index=base + offset 来索引(基址与偏移量都是值,没有差异,所以位置可以互换, 而index为内存地址) 。 所以说上面的那种形式,是这个特例 第一个元素都是基址,而第二个元素都是用[]扩起 那么它就是偏移量。只是常量字符串它的值为他的首地址,地址也是一个值(c语言是只是传值) 。所以进一步推广 这里的a、b 可以是求值表达式 那么上述两个例子的行为就在情理之中了.
下面我再给出 linux/fs/namei.c 中的一个例子 :
#define ACC_MODE(x) ("\004\002\006\377"[(x)&O_ACCMODE])

本文深入解析C语言中不常见的数组索引技巧,利用字符的ASCII码值进行复杂运算,展示了一种宏定义中字符串与数值运算相结合的高级应用实例。
最低0.47元/天 解锁文章
3539

被折叠的 条评论
为什么被折叠?



