C语言中的模式宏ACC_MODE文件访问控制以及O_ACCMODE

本文深入解析C语言中不常见的数组索引技巧,利用字符的ASCII码值进行复杂运算,展示了一种宏定义中字符串与数值运算相结合的高级应用实例。
#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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值