创建文件
vim ***.c
inc+tab 自动补全头文件
main+tab 自动补全主函数(一般直接用)
注意事项
#include <>与#include “”的区别
#include <>:直接在库文件中查找文件
#include "" :在当前目录下查找头文件,如果找不到则在系统库文件中查找
*系统库文件在/usr/include/中
argc与argv分别代表什么含义?
argc:外部传参的个数
argv:储存外部传参的值
// :单行注释
/* */ :多行注释
#if 0
#endif:宏注释
#:表示预处理命令
#include:引入头文件
int:和return 0的值的类型保持一致
main:一个程序只能有一个main函数
gcc编译器
gcc:有GNU发行的用于c和c++的集成器
运行程序
- 直接运行
gcc ****.c 默认生成a.out文件
运行a.out文件:./a.out
- 生成可执行文件
gcc ****.c -o 可执行文件名
运行可执行文件:./可执行文件名
- gcc的分步编译:-ESc .iso
-E -S -c iso
预处理 编译 汇编 链接
1). 预处理:展开头文件,替换宏,删除注释。
gcc -E ***.c -o ***.i
2).编译:检查语法正确性,生成汇编文件
gcc -S ***.i -o ***.s
3 ).汇编:把汇编文件转换为二进制文件(目标文件)
gcc -c ***.s -o ***.o
4). 链接:把二进制链接转换为可执行文件
gcc ***.o -o 可执行文件名
./可执行文件名
*-o:命名生成文件
认识数据类型的关键字
查看取值范围:vim/usr/include/limits.h
整数 | 占位符 | 字节大小 | 取值范围 |
int--->signed int(有符号数) | %d %i | 4 | [-2^31—2^31-1] |
unsigned int(无符号数) | %u | 4 | [0—2^32-1] |
short--->signed short int(有符号短整型) | %d | 2 | [-2^15—2^15-1] |
unsigned short int(无符号短整型) | %u | 2 | [0—2^16-1] |
long--->signed long int(有符号长整型) | %ld | 在64位中占8 在32位中占4 | [-2^63—2^63-1] |
unsigned long int(无符号长整型) | %lu | 在64位中占8 在32位中占4 | [0—2^64-1] |
long long(无符号长整型) | %ld | 8 | [0—2^64-1] |
unsigned long long(有符号长整型) | %lu | 8 | [-2^63—2^63-1] |
小数/实数/浮点数 | 占位符号 | 字节大小 | 有效位 |
float(单精度浮点型) | %f | 4 | 6——7 |
double(双精度浮点型) | %lf | 8 | 15——16 |
字符 | 占位符 | 字节大小 | 取值范围 |
char--->signed char | %c %d | 1 | [-128——127] |
unsigned char | %c %d %u | 1 | [0——255] |
常量(宏)
常量:一旦定义值不可改变
宏的格式:#define 宏名 宏体——不加“;”
- 整数的常量:100——#define a 100
- 小数常量:3.14——#define b 3.14
- 字符常量:'a'——#define c 'a'
字符需要查看ascii表:man ASCII
-128-127--->0-127 共有128个字符
'A'--->65 大写转换小写+32
'a'--->97 小写转换大写-32
'0'--->48 '0'-48可把'0'转换为0
- 字符串常量:“hello world”——#define d "hello world"
*解析
- #define:固定,预处理命令
- 宏名:满足c语言命名规范(由数字,字母,下划线组成;不可以是关键字;不可以是数字开头;见名知意,区分大小写)
一般宏名大写:宏大写,变量小写,函数名驼峰/下划线
宏---MAX 变量---max 函数---Max
- 宏体:默认是字符串类型
- 宏:只替换不做计算,不做正确性检测
- 宏只发生在预处理阶段
变量
变量:储存数据的容器,值可以改变
格式:存储类型 数据类型说明符 变量名
*解析
- 存储类型:
auto:自动类型变量,局部变量的存储类型默认是auto
static:静态变量,延长局部变量的生命周期
extern:引用外部变量
register:寄存器变量,不可以取地址操作
const:修饰词,修饰的变量值不变
volatile:修饰词,防止内存优化,保持内存的可见性
- 数据类型说明符:int/float/char/double
- 变量名:满足c语言命名规范(由数字,字母,下划线组成;不可以是关键字;不可以是数字开头;见名知意,区分大小写)
定义变量
- 整数变量的初始化以及赋值
定义
int a;//定义一个整数
int a,b,c;//当类型一致时,可以定义多个变量
初始化
int a=100;//把100赋值给a
赋值
int a;
a=100;//把100赋值给a
整形变量的数据溢出
如果数据越界则重新回到最大值或最小值
int a=2,147,483,647
int b=2,147,483,648
补充占位符:
%5d——占五个位置(正数向右对齐,负数向左对齐)
%02d——日历格式;占用两个位置,多余位置使用0填充
- 浮点数变量初始化以及赋值
定义
float a;//定义一个小数
double a,b,c;//当类型一致时,可以定义多个变量
初始化
float a = 3.14;//把3.14赋值给a
变量的赋值
float a;
a= 3.14;//赋值
%f%lf默认输出小数点后6位
- 字符变量的初始化以及赋值
定义
char a;//定义一个字符
char a,b,c;//当类型一致时,可以定义多个变量
初始化
char a='a';//把'a'赋值给a
赋值
char a;
a='a';//把'a'赋值给a
字符变量的数据溢出
如果数据越界则重新回到最大值或最小值
练习
定义一个宏,表示一年由多少秒
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N a=365*a;a=24*a;a=60*a;a=60*a
int main(int argc, const char *argv[])
{
int a;
scanf("%d",&a);
printf("输入年数=%d\n",a);
N;
printf("由%d秒组成\n",a);
return 0;
}
定义宏值为'h',请输出对应的大写
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 'h'
int main(int argc, const char *argv[])
{
printf("大写为%c\n",N-32);
return 0;
}
定义宏值为’H‘,请输出对应的小写
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 'H'
int main(int argc, const char *argv[])
{
printf("小写为%c\n",N+32);
return 0;
}
定义宏值为'5',请输出对应的平方25
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 5
#define M N*N
int main(int argc, const char *argv[])
{
printf("平方为%d\n",M);
return 0;
}
定义简单宏,实现两个变量的值交换
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N c=a;a=b;b=c
int main(int argc, const char *argv[])
{
int a,b,c;
scanf("%d%d",&a,&b);
printf("输入a=%d,b=%d\n",a,b);
N;
printf("输出a=%d,b=%d\n",a,b);
return 0;
}