C语言易忽略点总结

来源:互联网 发布:天猫和淘宝哪个赚钱 编辑:程序博客网 时间:2024/05/22 08:23

无符号数加法  s = x+y , 若s<x  或 s < y , 则发生溢出!

有符号数加法   s = x+y,若xy同大于0且 s小于x或y 负溢出   若xy同小于0,s大于x或y正溢出

int i = 9;main(){ int i = i;/*与全局变量无关*/} 

C语言 printf("%d  %d\n",m,m++);从右向左入栈!!!

(int&)a就是*(int*)(&a)

x&(x-1)可快速消除x中最后一个1!!!

(x&y) + ( (x^y)>>1 )计算(x+y)/2

两个指针的差值,与指针的数据类型有关,结果是绝对差值/sizeof(类型),即两指针间能容纳 元素的 个数 (指针类型不同无法运算)

<<左移都没有问题  >> 右移会有问题!     unsigned 右移必为逻辑右移(补0) 同java中 >>>     signed 右移通常为算术右移(补最高位)同java中>>   位移长度超字长  会对字长取模再位移  java只支持有符号数

对无符号数进行扩展(赋给更大空间的数据类型),高位补0称为零扩展;有符号数进行扩展,扩展出的位填写原最高位称为符号扩展(同移位运算)

short - >unsigned long  进行转换时,由于原数据有符号,故首先以符号扩展增加位数,再转换为unsigned型

inline 会导致 函数有static特性,故多个编译单元需要inline时将其定义放入头文件。

extern inline 同一编译单元下作为内联,不同编译单元则作为普通引用

sizeof为C/C++语言关键字 度量变量时可以不加括号

使用register修饰的变量长度必须小于整型且不能取地址&

static修饰变量和函数

模块缩写_作用域前缀|数据类型前缀|[指针前缀]|含义标识|数组/结构后缀

                    g/n/f/a     bt/b/c/i/s/l/u/d/f/p/v/st/fp                               _a/_st/_pst 

当心类型的溢出(char!!!)

if(BOOL)  if(nBOOL)

if((fTestVal >= -EPSINON)&&(fTestVal <= EPSINON))

if(NULL == p)  if(NULL != p)

else 与最近的if 相结合

条件判断时对于=的处理

case后面只能是整型或字符型的常量或常量表达式

嵌套循环,长循环在内层效率较高

任何类型指针无需强制转换即可赋给void*(x向上转型)

C语言中函数不声明返回值,默认返回整型

C语言中可以向无参数的函数输入任意参数(必须用void限制,C++则不需要)

 不对void*进行算数运算

const 修饰只读变量 C语言中编译时其值未知,故无法替代#define

数组名的为数据首元素的地址;对数组名取地址,为指向该数据的指针;两者值相同,类型不同,算术运算规则不同

数组名与普通指针的另一不同在于sizeof

数组名与数组名地址后sizeof的不同,sizeof(&数组名) 为普通指针大小

char a[] = "1234567"  sizeof(a) == 8strlen(a) == 7

typedef 用来定义一个变量类型的别名。static 不是变量类型。它定义存放方式。

预处理/**/被替换成空格

y=x/*p    ???

a++  待遇到;或,即一个运算单元结束后开始自增

左移和右移的位数不能大于数据的长度,不能小于0

{}花括号的作用 形成整体 与外界隔绝

优先级   []    ()   .   ->   单目运算   双目运算(运算 比较 逻辑)  赋值   ,

const修饰的只读变量不能用来作为定义数组的维度,也不能放在case关键字后面

预处理中 去注释先于宏替换

宏函数不吝啬括号

_LINE_ _FILE__DATE__TIME__STDC_

#line number ["filename"]

编译器默认将结构和栈中的数据进行内存对齐,未对齐的成员先后移,将每一个成员都对齐到自然边界上,从而导致整个结构的尺寸变大

            char     short    float     double    intlong     longlong     pointer

32        8 16         32        64          32         32            6432

64  816         32        64 32         64            64 64

结构对齐   成员自身对齐值s(基本类型为其数据长度  结构类型为其内最大成员长度)   指定对齐值p  有效对齐值v = min(s,p)  各成员以%v = 0 的地址排列  最后将结构按整体对齐系数min(max(s),p)圆整

32位系统 默认p = 4; 64未系统默认p = 8   内存对齐 平台原因 性能原因

switch 的内容可以是 intchar、枚举、bool

#运算符#define SQR(x) printf("The square of x is %d.\n",((x)*(x)))   SQR(5)The square of x is 25

#define SQR(x) printf("The square of #x is %d.\n",((x)*(x)))        SQR(5)The square of 5 is 25

##运算符#define XNAME(n) x##n XNAME(5)x5

char a[10] extern char a[](正确)extern char* a(错误)

char* a= "abcdefg"extern char* a(正确)extern char a[]  (错误)定义和声明必须一致

char a[10]指向数组a的指针 char (*p)[] = &a失去了数组a元素个数为10的信息

指向数组a的指针 char (*p)[10] = &ap与a保留完全一致的信息

&a 为指向数组的指针 等同于char (*p)[]; 取值时需要**(&a)或**p

研习此代码 二维数组

int main()

{

int a[5][5];

int (*p)[4];

p = a;

printf("%d \n", &p[4][2] - &a[4][2]);

}

C语言中,当一维数组作为函数参数时,编译器总是把它解析成一个指向其首元素地址的指针。这条规则并不是递归的。也就是说只有一维数组才是如此,当数组超过一维时,将第一维改写为指向数据首元素地址的指针后,后面的维再也不可改写。

比如:a[3][4][5]作为参数时可被改写为(*p)[4][5]

(*(char**(*)(char**,char**))0)(char**,char**);


# 可以将宏变量展开为字符串 eg. #define MACRO(a) #a ==> MACRO(abc) => "abc"

##   可以将宏变量连接                           eg  .     #define MACRO(a ,b)  a##b                ==>             MACRO(abc,def )   =>  abcdef 

 当需要 实现 a.b时   无需使用##!!!!!!

0 0
原创粉丝点击