c语言const用法:
const int a = 10;
a = 999;//此时编译器会报错,因为const修饰变量不能发生改变
const int a = 10;
int * const p = &a;
*p = 99;//此时不报错,只会有警告,但其余的语言会报错,C语言是弱类型语言。
int b = 88;
p = &b;//报错,const修饰的是p,所以p的值不能更改
const int a = 10;
const int *p = &a;
//int const *p = &a;效果一样
*p=99;//错误,此时const修饰的是*p,不能进行间接访问
联合体
union UU
{
short sh;
char ch;
}UU;//sizeof(UU)值为2个字节,内部成员共用内存
利用联合体可判断大小端存储
小端存储:低地址存低位数据
union UU
{
short sh;
char ch;
}UU;
int main()
{
UU.sh = 0x1122;
if(UU.ch == 0x22)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
整形提升与截断
提升左边补谁,取决于当前变量的类型。
char a = -128;
//1000 0000 0000 0000 0000 0000 1000 0000
//1111 1111 1111 1111 1111 1111 0111 1111
//1111 1111 1111 1111 1111 1111 1000 0000
//1000 0000(整形截断)
//char为有符号字符型,且a为负数,提升补1.
//1111 1111 1111 1111 1111 1111 1000 0000
//是否求原码:1.以%u打印(不求) 2.类型本身就是无符号。
int main()
{
char a = 128;
//0000 0000 0000 0000 0000 0000 1000 0000
//1000 0000(截断)
printf("%u",a);//以%u打印,不求原码
//1111 1111 1111 1111 1111 1111 1000 0000
return 0;
}
易错题
int main()
{
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u",i);
}//结果出现死循环,因为以%u打印,-1是最大的数,会大于0.
return 0;
}
int main()
{
unsigned char i;
for(i = 0; i <= 255; i++)
{
printf("hello world\n");
}//结果出现死循环,因为255+1,发生截断,又从0开始。
return 0;
}