Skip to main content
 首页 » 编程设计

C易忽视的基础

2022年07月19日141powertoolsteam

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文件编译到编译阶段(预处理-编译-汇编-链接),此时他不知道在其它文件中定义的类型,从而不知道其大小,因此报错,定义为一个指针,就是一个指针的大小,不会编译报错。


本文参考链接:https://www.cnblogs.com/hellokitty2/p/8604173.html
阅读延展