1、C中printf计算参数时是从右到左压栈的。
定义一个数组 int arr[ ] = {6 , 7, 8 , 9, 10}
再定义一个指针 sint *prt = arr;
printf("%d ",*ptr); 此时ptr指向第一个元素6;
*(ptr++)+ = 123展开为*ptr = *ptr + 123; ptr++; 此时ptr指向第二个元素7;
printf(“%d,%d ”,*ptr,*(++ptr)); 从右到左运算,第一个是(++ptr),也就是ptr++,*ptr = 8,此时ptr指向第三个元素8,所以输出全为8.
2、编程风格
if('A' = a)
{
a++;
}
if(a == 'A')
{
a++;
}
第一种写法更好一些。如果把“==”误写做“=”,因为编译器不允许对常量赋值,就可以检查到错误
3、
%08x为整型以16进制方式输出的格式字符串,会把后续对应参数的整型数字,以16进制输出。08的含义为,输出的16进制值占8位,不足部分左侧补0。
4、类型转换
设 unsigned int a = 0xFFFFFFF7;
对于语句char* b = (char*)&a中a本身为一个uint类型的值,把它的地址赋给一个执行char类型数据的指针。char类型的长度只有一个字节,打印char类型的指针指向的值会是多少?
&a的结果是一个指针,它的类型取决于a的类型,此处&a的类型应该是:
unsigned int *;
char *b = (char *)&a;
上面等价于:
unsigned int *p = &a; //p中的内容是a的地址,即p指向a
char *b = (char *)p; //此处的强制转换只是使b也指向a而已
上面的步骤就是将一个unsigned int 类型的指针强制转换成一个char型的指针。
所以请注意:这里是char类型的指针转换,而不是char类型的转换。
这样转换后,假设a的地址是x:
p + 1 = x + 1*sizeof(int) = x + 1* 4 = x + 4;
b + 1 =x + 1*sizeof(char) = x + 1*1 = x+1;
因此将一个unsigned int 类型的指针强制转换成一个char型的指针影响的只是指针的寻址,一开始都是指向a地址的开头。
所以printf("%08x",*b); 得到的是FFFFFFF7