- 一个C程序就是由若干头文件(#include)和函数组成,并有且只有一个主函数
- 在最新的C标准中,main函数前的类型为int而不是void(表示无类型没有返回值)
- 单行注释: //、多行注释: /* */
- 标识符:尽量不超8位、分大小写、非关键字、有意义
- 变量赋值的两种方式:1.先声明再赋值 2.声明的同时赋值
-
基本数据类型分四大类:
- 普通整型int,字符型char,浮点型float,双精度浮点型double
- 常量分为直接常量(即字面量)和符号常量(需要#define 标识符 常量值来定义)
- 变量可在编译时可自动类型转换,char类型数据转换为int类型数据遵循ASCII码中的对应值,字节小的可以向字节大的自动转换,但字节大的不能向字节小的自动转换
- 强制类型转换((数据类型) (表达式)):必须加括号;不会修改原值;不遵循四舍五入原则
- 算数运算符:加+ 减- 乘* 除/ 求余%(运算后的符号取决于被模数的符号) 自增++ 自减--
- 关于自增运算符:-/+号在前:先运算再取值,在后则反之
- 复合赋值运算符:即在简单运算符前面加=(如+=)
- 关系运算符: > >= < <= == !=
- 逻辑运算符:与&& 或|| 非!
- 三目运算符:表达式1? 表达式2:表达式3
- 分支结构:
if (表达式){
代码块
if (表达式){ // 嵌套if-else语句
代码块Inner
}
}
[else if (表达式2)]{ // 多重if-else语句
代码块2
}
[else]{
代码块3
}
- 循环结构:while循环、do-while循环(先do再循环,while后面需有分号)、for循环(1初始;2判断;3步进,分号不能省略,变量要在for之前定义)
- 用循环结构和操作运算符实现水仙花数字:
/*所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数*/
#include <stdio.h>
int main()
{
//定义三位数num,个位数sd,十位数td,百位数hd
int num, sd, td, hd;
//循环所有三位数
for(num=100; num < 1000; num++)
{
// printf("%d", num);
// 获取三位数字num百位上的数字
hd = num/100 ;
//获取三位数字num十位上的数字
td = num/10%10 ;
//获取三位数字num个位上的数字
sd = num%10 ;
//水仙花数的条件是什么?
if(hd * hd * hd + td * td * td + sd * sd * sd == num)
{
printf("水仙花数字:%d\n", num);
}
}
return 0;
}
- 多重循环:一般用2~3层循环,父循环执行一次,子循环需要全部执行完,直到跳出循环
- 分支结构switch:
switch(表达式){
case1 exp1: code1; break; // case后的各常量表达式不能相同,否则报错
case2 exp2: code2; break; // 代码块后面的分号不要忘
caseN expN: codeN; break;
[default: codeX; break;]
}
switch后面的表达式语句只能是整型或字符型
在case后,允许有多个语句,可以不用{}括起来
case和default子句的顺序可以变动,结果不变
- goto语句:执行后,程序将跳转到定义的标识符(一般用英文大写)处并执行其后的语句
- 函数的定义:
/*其中[]内为可选内容*/
[数据类型说明] 函数名([参数]){ // 数据类型默认是int
执行代码块;
return (表达式);
}
自定义函数尽量放在main函数之前,如果在其后需要在前面先声明
形参是用来接收调用该函数时传入的参数,
实参是在调用时传递该函数的参数
递归函数:自我调用且有完成状态,具有递推和回推两个阶段
- 函数返回值为三目运算符的写法:
return 判断?表达式1:表达式2;
- 变量存储类别:按生存周期可分为静态存储方式和动态存储方式;按存储类别可分:自动auto(可省略)、静态static(分局部和外部)、来自寄存器register、来自外部extern
- 静态局部变量属于静态存储类别,只赋初值一次(如无赋值则默认为0或空字符)
- 只有局部自动变量和形式参数可以作为寄存器变量,不能定义任意多个寄存器变量(有限)
- 外部变量的意义是某函数可以调用在该函数之后定义的变量
- 内部函数:不能被其他源文件调用的函数(也称静态函数),用
static
定义
外部函数(系统默认):能被其他源文件调用的函数,用extern
定义 - 数组:一块连续的、大小固定、数据类型一致的内存空间(数组是相同类型变量集合);
三种初始化:-
数据类型 数组名称[数组长度n] = {元素1, 元素2...元素n}
(当元素小于长度,多余的元素默认为0) 数据类型 数组名称[] = {元素1, 元素2...元素n}
-
数据类型 数组名称[数组长度n];数组名称[0] = 元素1;数组名称[1] = 元素2;数组名称[n-1] = 元素n
在声明数组后没有进行初始化的时候,static和extern类型的数组元素初始化元素为0,auto类型的数组的元素初始化值不确定
-
27.字符串是用数组定义的:
法1:
char 字符串名[长] = "字符串值"
法2(在数组中不能写中文):
char 字符串名[长] = {'字符1', '字符2', '字符3', .... '字符n', '\0'} //注意末尾的\0字符是结束标志
/*字符串数组当作形参时的写法*/
void foo(char stringname[]){
return;
}
常用字符串函数:strlen(), strcmp(s1, s2), strcat(s1, s2), strcpy(s1, s2), atoi(s1)
- 多维数组:数组名后跟n个维度(称作第一维下标...第n维下标),使数组中的元素可以再用下标访问,如下
int number[2][5] = {{11,12,13,14,15}, {21,22,23,24,25}}
可看作一个2×5的二位矩阵;多维数组的初始化与数组类似:-
数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
(必须指定列的维数,系统会根据元素总个数分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数) -
数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;
(需要同时指定行和列的维数)
-
- 求二维数组的对角线之和:
#include <stdio.h>
int main()
{
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++){
if((i+j)%2==0) //关键点
sum+= arr[i][j];
}
}
printf("对角线元素之和是:%d\n",sum);
return 0;
}
- 结构体:是用户自定义的可用数据类型,可存储不同类型变量集合(与数组相反),有几种定义方法:
// 这里是定义了一个结构体类型
struct weapon{
char name[20];
int cost;
char memo[100];
};
// 法1:声明和定义分离的形式
struct weapon weapon_number1;
// 法2:在声明的时候定义,即在尾部加变量名
struct weapon{
char name[20];
int cost;
char memo[100];
}weapon_number2;
// 法3:不指定结构体名字,直接定义变量
struct{
char name[20];
int cost;
char memo[100];
}weapon_number3;
初始化:用{}把常量依次传入,即weapon_number1={"gun", 70, "warning"}
访问成员的值:用.
(成员运算符),weapon_number1.name
结构体数组的声明:由结构体组成的数组
struct weapon weapon_numbers[2] // 初始化时需要依次指定6个常量
结构体指针:
// 指针变量c指向结构体weapon_number1
struct weapon * c;
c=&weapon_number1;
//调用结构体成员,可用c->name替代(->称作指向运算符);
(*c).name; // 指针两侧变量不能省略(因成员运算符.的优先级高于*)