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.23if (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编辑  收藏  举报

导航