C易忽视的基础
1.输出格式控制:%x按int型16进制输出; %d按int型十进制输出;变量超出4字节会丢掉低位!!!!(却不是被截断!!!)
void main()
{
int a=0x11223344;
long b=0x1122334455667788;
int c = b;
int d = (int)b;
char *pc = &a;
printf("sizaof(int)=%d sizeof(long)=%d\n", sizeof(int), sizeof(long));
printf("b=0x%x\n", b);
printf("b=0x%p\n", b);
printf("c=0x%x\n", c);
printf("c=%p\n", c);
printf("d=0x%x\n", d);
printf("d=%p\n", d);
printf("pc=%x\n", *pc);
}
输出:
sizaof(int)=4 sizeof(long)=8
b=0x55667788
b=0x0x1122334455667788
c=0x55667788
c=0x55667788
d=0x55667788
d=0x55667788
pc=44
小端低位地址,高位高址,直接截断
2.全局变量的初始化右值必须是常量(可以常量运算), 但是不能是变量,因为编译器在编译期不知道变量的值是什么。
int a = 10+5; 对
int b = a; 错
3. 无符号数进行减除操作,需要注意
void main() { unsigned int a = 1, b = 2; unsigned int c = a - b; unsigned int d = c / 100; printf("d=%d\n", d); /*d=42949672*/ }
void main() { unsigned int a = 1, b= 0, c=0, d=1; unsigned int m, n, p; m = a - b; n = c - d; p = (m*1000 + n)/1000; printf("p=%d\n", p); /*unsigned int: 0, unsigned char 1*/ }
4. sizeof("Hello") 为6,不为4或8!
5. (*p)++ 与 *p++
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 void main() 6 { 7 int a = 10; 8 char *p = &a; 9 printf("p=%p, *p=%d\n", p, *p); 10 11 (*p)++ = 20; 12 13 printf("p=%p, *p=%d\n", p, *p); 14 } 15 16 /* 17 *p++ = 20; 18 p=0x7ffc77230674, *p=10 19 p=0x7ffc77230675, *p=0 20 21 (*p)++ = 20; 22 test.c:11:9: error: lvalue required as left operand of assignment 23 (*p)++ = 20; 24 ^ 25 */
6. memcpy() 与 memmove()的区别是前者原地址和目的地址不能重复,后者是可以重复的。
7.由于浮点型数据并没有准确的数值, 所以不得进行相等(或不相等)比较。
float value = 12.23; if (value == 12.23) { //判断结果为false .... } 如果需要对其进行等值判断, 可采用类似如下方式: float value = 12.23; if (value >= 12.2299 && value <= 12.2301) { //判断结果为true .... }
8. 有符号数和无符号数混合操作,结果会被转换为无符号数,此时无论如何也不会小于0
void main() { int a = -10; unsigned int b = 2; if (a + b < 0) { printf("a + b < 0\n"); //不会打印 } }
9. 一个.c文件中定义的结构体要在另一个.c文件的结构体中使用,定义成此类型的指针可以,但是定义为此类型的实体就不行了。因为单个.c文件编译到编译阶段(预处理-编译-汇编-链接),此时他不知道在其它文件中定义的类型,从而不知道其大小,因此报错,定义为一个指针,就是一个指针的大小,不会编译报错。
posted on 2018-03-19 19:23 Hello-World3 阅读(189) 评论(0) 编辑 收藏 举报