C言语语法总结(随时更新)

复制代码
一、gcc
1. gcc xxx.c -o xxx #把原代码编译成可执行文件xxx
2. gcc -c xxx.c #编译: 把原代码编译xxx.o后辍的目标文件
3. gcc xxx.o -o xxx #链接: 把xxx.o后辍的目标文件链接成可执行文件xxx ###2.3 步等于1,但是会多出个xxx.o的目标文件,可用于检查错误

4. 编译过程
  1. 预处理: gcc -E demo.c -o demo.i #生成预处理文件 (处理#开头的命令, 如宏展开, include代码复制, 删除注释等)
  2. 编译: gcc -S demo.i -o demo.s #把预处理文件生成汇编文件(词法分析, 语法分析, 语义分析) 也可以直接把源文件生成汇编文件 gcc -S demo.c -o demo.s
  3. 汇编: gcc -c demo.s -o demo.o #把汇编文件生成.o后辍的目标文件, 也可以直接使用源码文件生成目标文件
  4. 链接: gcc demo.o -o demo #把目标文件链接成可执行文件 也可以直接把源文件直接生成可执行文件 gcc demo.c -o demo 经历的过程有预处理、编译、汇编、链接 #等同于ide的buile和run

Visual Studio
1. F5或ctrl+F5或本地Windows调试器 #把原代码编译成可执行文件xxx
2. 生成->编译 #生成xxx.obj目标文件
3. 生成->仅用于项目->仅链接 cDemo #生成可执行文件xxx.exe ###2.3 步等于1

二、语法
1. puts("hello world"); #输出字符串
2. printf("a=%d, b=%d, c=%d", a, b, c); #10进制输出
# %hd 十进制输出 short 类型
# %d 十进制输出 int 类型
# %ld 十进制输出 long 类型
# %#ho 八进制输出 short 类型
# %#o 八进制输出 int 类型
# %#lo 八进制输出 long 类型
# %#hx/%#hX 十六进制输出 short 类型
# %#x/%#X 十六进制输出 int 类型
# %#lx/%#lX 十六进制输出 long 类型 十六进制的表示用到了字母, 因此x/X字母的表现形式不同,0b/0B 二进制 0 八进制 0x/0X 十六进制

# %c 输出一个字符

# %f 输出一个小数float #float与double类型的区别是, float点四字节(32位), double占8字节(64位)
# %lf 输出一个小数double
# %e 以指数输出一个float类型3.020000e-1
# %E 以指数输出一个float类型3.020000E-1
# %le 以指数输出一个double类型1.126400e+05
# %lE 以指数输出一个double类型1.126400E+05
# %g 智能输出小数float, 若是指数形式e小写
# %lg 智能输出小数double, 若是指数形式e小写
# %G 智能输出小数float, 若是指数形式E大写
# %lG 智能输出小数double, 若是指数形式E大写

# %s 输出一个字符串

3. int: 8Bit=1Byte(字节),一般占4字节,32Bit,也叫32位,如果不考虑正负数int类型保存的最大数为2的32次方减1, 约43亿
short int(short) 只占2字节(16位),如果不考虑正负数short保存的类型最大数2的16次方减1, 等于65535
long int(long) 占8字节(64位),如果不考虑正负数long保存的类型最大数2的64次方减1,这个值很大,过亿万亿了,我也不知道是多大
char 占一字节(8位) 如果不考虑正负数char保存的最大值为2的8次方减1, 等于255, 考虑正负数-128到127
4. 数据类型的长度(不同数据类型占的字节数称为数据类型长度)
sizeof 方法可以检测出长度 short 2字节, int 4字节, long 4/8字节(系统不一样)
内存中存储的数字是以补码形式存储的

三、多线程
1. 创建线程: pthread_create
2. 阻止调用线程并接收返回值: pthread_join
3. 终止当前线程: pthread_exit
4. 线程间的终止信号: pthread_cancel (注意取消点的问题)
5. 锁 

四、进制之间的转换
1. 整数任意进制转换为十进制: 按权相加
如: 八进制转成十进制 53627 = 5*84+ 3*83 + 6*82 + 2*81 + 7*80 = 22423
   十六进制转成十进制 9FA8C = 9*164 + 15*163 + 10*162 + 8*161 + 12*160 = 653964
   二进制转成十进制 11010 = 1*24 + 1*23 + 0*22 + 1*21 + 0*20 = 26
2. 小数任意进制转换为十进制:
如: 八进制转成十进制423.5176 = 4*82 + 2*81 + 3*80 + 5*8-1 + 1*8-2 + 7*8-3 + 6*8-4 = 275.65576171875
3. 整数十进制转换成任意进制: 除N取余, 逆序排列
如: 十进制转成八进制 36926 = 36926/8 = 4615 % 6 (商为4615余6)
                            4615/8 = 576 % 7
                            576/8 = 72 % 0
                              72/8 = 9 % 0
                                9/8 = 1 % 1
                                1/8 = 0 % 1
                                                 = 110076
十进制转二进制   42 = 42/2 = 21 % 0
                                    21/2 = 10 % 1
                                    10/2 = 5 % 0
                                      5/2 = 2 % 1
                                      2/2 = 1 % 0
                                      1/2 = 0 % 1
                                            = 101010
4. 小数十进制转任意进制: 乘N取整, 顺序排列
如: 十进制转八进制 0.930908203125 = 0.930908203125*8 = 7.447265625 int 7(整数部分)
                                = 0.447265625*8 = 3.578125 int 3
                                = 0.578125*8 = 4.625 int 4
                                = 0.625*8 = 5.0 int 5
                                = 0.7345(八进制)
   十进制转二进制 0.6875 = 0.6875 * 2 = 1.375 int 1
                        = 0.375 * 2 = 0.75 int 0
                        = 0.75 * 2 = 1.5 int 1
                        = 0.5 * 2 = 1.0 int 1
                        = 0.1011(二进制)
 
 
0.1   = 0.1 * 2 = 0.2 int 0
= 0.2 * 2 = 0.4 int 0
= 0.4 * 2 = 0.8 int 0
= 0.8 * 2 = 1.6 int 1
= 0.6 * 2 = 1.2 int 1
= 0.2 * 2 = 0.4 int 0
= 0.4 * 2 = 0.8 int 0
= 0.8 * 2 = 1.6 int 1
= 0.00011001………………(无限循环的二进制)
复制代码

 

复制代码
----------------------------C++----------------------------------------
五、C++ 的命名空间
1. using namescape Name; 声明整个命名空间
2. using namescapename::var; 引入命名空间中的变量
3. 使用namescapename::var 方式使用命名空间中的变量

六、函数
1. 推荐使用内联函数来替换带参数的宏,内联函数不应声明,只要定义就行
2. 在同一作用域的函数的声明和定义,形参的默认值只能赋值一次,在不同作用域中可以赋值多次
3. 函数的重载:
    参数列表双叫参数签名(类型、个数、顺序只要有一个不同就表示签名不同)
    重载决议:精确匹配->类型提升->类型转换 如果在转换过程中不知道选用哪个函数,那么重载过程中会产生二义性错误

七、类与对象:
1. 类中的成员方法是内联函数,如果函数比较大,建议把类方法声明在类内部、定义到类外面,且在同一文件中

八、内存:
1. 全局数据区:在所有函数之外定义的变量、对象存放到全局数据区
2. 栈区:函数之内定义的变量和对象数据存放在栈区
3. 堆区:new创建的对象位于堆区
复制代码

 

posted @   龍飛鳯舞  阅读(325)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示