c语言一些细节问题
最近遇到的一些小问题
typedef union { int i; char c[4]; }un_t; int main() { int a = 0x12ff12ff; char *p = ((un_t)a).c; return 0; }
第十行这种写法 char *p = ((un_t)a).c; c89会报invalid use of non-lvalue array的错误.
如果改为 char *p = ((un_t)a).c + 0; 则是报错invalid operands to binary + (have ‘char[4]’ and ‘int’) .
但c99是支持这种写法的(以上两种).
另一个小问题是关于指针的加减运算.
int main() { char str[] = "abcdefghijk"; char *p1 = str + 5; char *p2 = p1 + 3; char *p3 = str; char *p4; p4 = p3 + p2 - p1; //error p4 = p3 + (p2 - p1); //ok return 0; }
第12行和13行虽然看上去是一回事, 结果也一样(可以通过强制转换通过编译)
但12行这样写会报错: invalid operands to binary + (have ‘char *’ and ‘char *’), 也就是指针之间不能相加
c标准规定, 指针的算术操作包括: (指针 – 指针), (指针 + 整数), (指针 – 整数), ++指针, 指针++, –指针, 指针–
这个问题虽然以前看书时留意过, 也许是觉得这种东西理所当然吧, 心想谁会在这里犯错误, “理所当然”地成为了一个被忽略的细节..