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 ", sizeof(int), sizeof(long));

printf("b=0x%x ", b);
printf("b=0x%p ", b);
printf("c=0x%x ", c);
printf("c=%p ", c);
printf("d=0x%x ", d);
printf("d=%p ", d);
printf("pc=%x ", *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
", 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
", 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
", p, *p);
10     
11     (*p)++ = 20;
12     
13     printf("p=%p, *p=%d
", 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
    ....
}
原文地址:https://www.cnblogs.com/hellokitty2/p/8604173.html