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"]
编译器默认将结构和栈中的数据进行内存对齐,未对齐的成员先后移,将每一个成员都对齐到自然边界上,从而导致整个结构的尺寸变大
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 的内容可以是 int
、
char
、枚举、
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时 无需使用##!!!!!!
- C语言易忽略点总结
- C语言中易忽略的几点
- c语言容易忽略的点
- C语言注意点总结
- 【总结】C语言中的scanf和printf函数易被忽略的部分
- java易忽略点
- C++易忽略点
- 关于C语言的几点总结
- C语言 点语法的总结
- 重温C语言 总结指针遗忘点
- C语言几点知识点总结
- C,C++语言易忽略的知识点学习(一)
- C语言内存四大区域几点总结
- C语言中易被忽略的地方
- 我所忽略的c 语言标准
- 字符串比较忽略大小写 c语言实现
- C语言中容易忽略的问题
- C语言之忽略SIGPIPE信号
- C语言-数据结构-希尔排序(shell sort)-源代码
- JVM进阶(六)——鲜为人知的二次标记
- spring整合SpringMVC+Mybatis+ehcache+quartz
- iOS弹幕
- linux内核学习-内核分类
- C语言易忽略点总结
- LightOJ 1003 Drunk【有向图的拓扑排序判环】
- Servlet实现Cookie读写
- Sphinx中文入门指南——新手可先看此文
- 今年暑假不AC
- 六合一串口模块使用说明
- 局域网访问本机电脑VM虚拟主机项目设置教程
- BroadcastReceiver、EventBus的优缺点
- 【C/C++】静态链接库、动态链接库、extern "C"