- 前言
- 一、C代码的基础框架
- 二、变量与常量
- 1.数值类型
- 1.1-基本类型
- 1.1.1-整型int
- 1.1.2-浮点型float
- 1.1.3-字符型char
- 1.1.4-枚举型enum
- 1.1.5-指针型
- 1.2-构造类型
- 1.2.1-数组
- 1.2.2-结构体
- 1.2.3-共用体
- 2.常量
- 3.变量
- 3.1-const
- 3.2-define
- 3.3-typedef
- 3.4-static
- 4.作用域
- 4.1-局部变量
- 4.2-全局变量
- 5.存储模型
- 5.1-自动
- 5.2-寄存器
- 5.3-静态、空连接
- 5.4-静态、外部链接
- 5.5-静态、内部链接
- 6.预处理
- 6.1-预定义
- 6.2-宏定义
- 6.3-条件编译
- 7.进制转换
- 8.获取随机值
- 三、运算符
- 1.算术运算符
- 2.关系运算符
- 3.逻辑运算符
- 4.sizeof()
- 5.优先级
- 总结
前言
本文主要是对作者学到的知识进行的一个总结,方便以后遗忘时可以回来看看。如果帮助到大家,实属荣幸,如果有不足之处大家也可以在评论中提出来,互相学习互相增长,随时更新,谢谢大家。
提示:以下是本篇文章正文内容,下面案例可供参考
一、C代码的基础框架.c 结尾的是C语言的源程序。
#includeint main() { printf("hello world!!n"); return 0; }
.h 译为head,表示头文件。stdio.h表示standard input output是标准输入输出头文件。对于头文件与函数的关系,我们可以联想成工具箱与工具,方便记忆。
“< >”是Linux系统自带的头文件,而自己的写的头文件用 " “,比如"my.h” 。
“;”代表一句话的结束,其功能是在屏幕上打印输出字符串。
int是整型,一种C语言的数据类型,后面会详细说明。
main是函数函数体开始,函数的返回值类型是int,() 里面放的main函数的参数列表。需要注意的是一个程序只能有一个入口函数main。
“printf”是一个函数,格式化输出函数。
“n”是一种换行符。
" "表达的是字符串, " "之间写什么,屏幕上就原封不动打印输出什么。
return是返回值的意思,返回值是0,是main函数体的结束。
(unsigned-无符号) (short int)/short:占用字节2,比特数16,取值范围:
-32768-32767,带unsigned:0-32767*2=65535。
(unsigned-无符号)int:占用字节4,比特数32,取值范围:
-2147483648-2147483647,带unsigned:0-2147483647*2=4294967295。
(unsigned-无符号)long int(long):占用字节8,比特数32,取值范围:
-2147483648-2147483628,带unsigned:0-2147483628*2=4294967295
以上类型,对应输出符号都为%d。
1.1.2-浮点型float float:所占字节4,比特数32,有效数字6~7,对应输出符号为%f。
double:所占字节8,比特数64,有效数字15~16,对应输出符号为%lf。
long double:所占字节16,比特数64,有效数字18~19,对应输出符号%lf。
.2f:结果保留两位小数。
(unsigned-无符号)char:所占字节1,比特数8,取值范围-128127,无符号0255,对应输出符号%c。
string:字符串类型,可理解成字符型数组,内部容量根据实际需求确定,对于输出符号%s。
字符串常量与静态变量类似,都是程序结束时才被释放。
同时,字符有其对应的ASCII码,
‘0’ -‘9’~48-57
‘A’-‘Z’~65-90
‘a’-‘z’~97-122
enum:枚举变量只能被赋予枚举值。枚举值会被默认标号,从0开始,依次递增。
enum 枚举名
{
枚举值1,
枚举值2,
枚举值3,
…………
}枚举变量表列(a,b,c……);
1.1.5-指针型
*+any(例:int *a),指针类型包含很多,常见的有int型、char型、struct型等。指针常量只有唯一的一个空地址NULL。
1.2-构造类型 1.2.1-数组一维数组:
最简单的数组,语法为“数组类型 数组名[数组内容个数]”由一个集合构成,标号从0开始。
例:int a[3],则调用数组内部成员分别通过a[0]、a[1]、a[2]调用。
二维数组:
多维数组中,最简单的数组,内部结构可理解成矩阵,语法为“数组类型 数组名[行数][列数]”,调用内部成员方式与一维数组类似,只不过多了描述行和列的位置。
例:int a[2][2],内部结构为两行两列的二维数组,调用第一行第二列的语法为a[0][1]。
用户自定义数据类型的一种,语法结构为:
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
…………
}结构体变量表列;(可写可不写,与普通变量一起定义也可以)
例:
struct Stu
{
int age;
char sex;
char* name;
}e1,e2;
或
struct Stu
{
int age;
char sex;
char* name;
};
struct Stu s1;
1.2.3-共用体
用户自定义类型的另一种,与语法结构为:
union Stu
{
int age;
char sex;
char *name;
};
创建变量的方法与结构体相同,唯一不同的是,共用体内存由其最大的成员决定。
2.常量 多指存在于代码中的内容不固定的一个类型的数值名。
例:int a;——定义了一个整型变量a。
char b=‘c’;——定义了一个字符型’’变量b,其值为‘c’。
使用const定义的常量,之后不能被改变,做参数也是。
语法规则:int const a;
或:const int a;
对于指针
int * const a;与const int *a/int const *a;是不同的,前者是指针常量,不能改变a的值;后者是常量指针,可改变其指向,但不能改变其指向的变量的值。
一种进行符号替换的关键字,通常与头文件放在一起。
语法结构:
#define A 10 ——让代码中,所有的A的值都为10。
用于给一种数据类型定义新名字的关键字。
例:typedef signed char s8——给有符号字符型取名为s8
之后便可使用新名字命名:s8 a;——定义了一个有符号字符型变量a。
当对结构体使用typedef时,需要注意。
typedef struct Stu
{
成员表列
……
}STU,*PSTU;
此时,在主函数中可以通过STU定义普通结构体变量,使用*PSTU定义指针结构体变量。
3.4-static static关键字声明的静态变量存储在数据段(也称全局区)。未初始化时其值为0存储在数据段的未初始化区,初始化时存储在数据段的初始化区。
修饰局部变量,称静态变量,作用域不变,生命周期被延长,直至整个程序结束,如果被调用多次执行的是同一个变量,值初始化一次,未初始化默认值为0。
修饰全局变量,变量只能在本文件调用,不能被其他文件调用。
修饰函数,只能在本文件中使用,不能被其他文件调用。
若想在其他文件中调用,就需要使用extern进行外部声明。
静态变量在声明后,除非在外部文件中使用extern声明后可以调用,其余情况下只能在本文件中使用,并且在程序结束时才被销毁。
例:
static int a = 10;
或
static void add()
{
printf(“1+1=2”);
}
使用static声明后也可以看作将该块内容保护起来,不能被其他文件调用或修改。
4.作用域 4.1-局部变量在主函数内部定义的变量都属于局部变量,仅在主函数内部有效。每个函数的参数也属于局部变量,作用域仅限于当前函数内。
4.2-全局变量(extern可加可不加。)在任何函数外部定义的变量都是全局变量,在整个代码中都有效。
5.存储模型 5.1-自动 一般没有特别声明的变量,都属于自动型变量,auto可写可不写。同时具有动态存储期、代码块的作用域、空连接。
例:int a; auto int a; 二者是一样的。
使用修饰符register声明的变量属于寄存器存储类。具有自动存储器、代码块作用域和空连接。
需要注意的是,不能对该类性的变量使用“&”,因为他存储在cpu的寄存器中。
使用static修饰的变量属于静态空连接存储类,使用静态存储方式。所有全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
空连接指该变量的作用域是定义它的代码块。
使用static定义的全局变量属于静态全局变量。
使用static定义的局部变量属于静态局部变量,生存期与为整个程序执行期间,作用域与局部变量相同,只能在定义该变量的函数内使用该变量。
未使用static描述的的全局变量属于静态、外部链接存储类,具有静态存储时期、文件作用域和外部链接。在使用外部变量的函数中使用extern关键字来再次声明,若在其他文件中定义的,则必须使用extern。
外部链接:外部链接的变量可以在多个文件中使用。
使用static描述的全局变量属于静态、内部链接存储类,仅能被与他在同一文件的函数使用。
内部链接:内部链接的变量只能在一个文件中使用。
一些之前定义好的一些符号,用于表示各种信息。
例:
FILE 表示正在与编译的源文件名
LINE 表示文件当前行的行号
FUNCTION 表示当前所在的函数名
DATE 表示预编译文件的日期
TIME 表示预编译文件的时间
STDC 如果编译器遵循ANSIC,则值为1
define的具体应用。
无参数宏定义:
例:#define M (y + 3),代码中的“(y+3)”都可由M代替。
有参数宏定义:
例:#define M(y) y+3,代码中的“y+3”都可由M(x)代替,使用时必须传参。
需要注意的是,宏定义无脑替换,定义的什么,表达式就是什么,没有需要自己加括号的情况。
#define X 2
#define Y X+1
printf("result is %dn",Y*Y);
//结果为2+1*2+1 = 5
6.3-条件编译
语法结构为:
#if 条件
………
#endif
例:
#ifdef DEBUG
int i;
for ( i = 0 ; i < 5 ; i++ )
{
printf("%dn",a[i]);
}
#endif
7.进制转换
简单方法:
八进制-%o、十进制-%d、十六进制-%x/%X,若在八进制与十六进制前加“#”,则在每个数前显示“0”。
复杂方法:
十进制转二进制——先跟2取余,再除2,直至除的结果为0
十进制转八进制——先跟8取余,再除8,直至除的结果为0
十进制转十六进制——先跟16取余,再除16,直至除的结果为0
二进制转八进制——三个一组,每组按421算值, 例:010001->010 001->021
二进制转十进制——从最右侧开始以0开始依次递增1到最左端结束,然后2取标号的幂相加,例:10001100->22+23+2^7
二进制转十六进制——四个一组,每组按8421算值,
例:10100010->1010 0010->0xA2
语法结构
头文件:#include
语句:srand(time(NULL));
int z=rand()%n;——对n取余表示随机获取n之前的值。
原理
time()是获取1970年至今的差数,srand()是获取一组随机数,srand(1)是一组,srand(2)又是一组。
而rand()从刚才获取的一组随机数。
“+”加法运算符 int a = 3 + 5; //a = 8;
“-”减法运算符 int b = 3 - 5; //b = -2;
“*”乘法运算符 int c = 3 * 5; //c = 15;
“/”除法运算符 int d = 5 / 3; //d = 1;
“%”模运算符(求余运算) int e = 5 % 3; //e = 2;
“,”逗号运算符
例:s=2; d=3; a=12+(s+2,d+4);先算括号内的值:s+2=4,d+4=7;括号内应为(4,7),括号内取值只取最后一个,如果没有括号则取第一个;a=12+7=19。
“<”小于
“<=”小于等于
“>”大于
“>=”大于等于 //(1)(2)(3)(4)优先级相同(高)
“==”等于
“!=”不等于 //(5)(6)优先级相同(低)
“&&”逻辑与 // (a>b)&&(x>y)
“||”逻辑或 // (a>b)||(x>y)
“! ”逻辑非 // ! (a > b) ###举例:if(!a)
对于“&&”,当第一个条件表达式成立时,需要看第二个,第二个也正确,结果为1否则为0;当第一个不成立时,不需要再看第二个,结果为0。
对于“||”,当第一个条件不成立时,需要看第二个,第二个也不成立,结果为0否则为1;当第一个条件成立时,不需要看第二个,结果为1。
作用:求变量或数据类型所占内存空间的大小,以字节为单位。
若为字符串测量,包含了‘ ’。
算数运算符>移位运算符>条件运算符>按位运算符>赋值
括号成员第一:()、[]、->、.、
全体单目(操作数只有一个)第二:!、~、++、–、-、(类型转换)、、&、sizeof()
乘除余三:、/、%
加减四:+、-
移位五:>>、<<
关系六:<、<=、>、>=
等于不等排第七:=、!=
位与、异或、和位或“三分天下”八九十:第八“&”、第九“^”、第十“|”
逻辑或跟与十二和十一:第十一“&&”、第十二“||”
条件高于赋值:十三“ ? : ”、十四“=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=”
逗号运算级最低。:“,”
总结
这次就先更到这里,后续还会更新。



