C语言笔记
- 因为默认main为int所以可以直接:
- main(){
- …
- }
- if(表达式){语句;}
- else if(表达式){语句;}
- else if(表达式){语句;}
- else{语句;}
- 表达式1?表达式2:表达式3
- 表达式1成立计算表达式2的值
- 表达式1不成立计算表达式3的值
- switch(表达式){
- case 表达式1: case 2: case 3:
- 语句;break;
- case 表达式4:
- 语句;break;
- default:语句;break;
- }
- while用于循环体执行之前检验
- do用于循环执行之后检
- for用于递增或递减计数变量的循环
- continue语句仅在循环可用
- while(表达式)表达式不为0即执行
- {语句;}
- 如果一来就为0,会一次都不执行直接跳出循环
- do{语句;}while(表达式);
- 先执行循环,再判定
- 至少执行一次循环
- for(表达式1;2;3)
- 表达式1用来赋初值(循环执行前)
- 表达式2用来控制循环终止
- 表达式3(循环执行后执行)
- 可以等价于
- 表达式1;
- while(表达式2){
- 语句
- 表达式3;
- }
- 返回类型 函数名(形式参数)
- {
- 声明;
- 语句;
- }
- (花括号内的称为函数体)
- 函数名(实际参数);
- 返回类型 函数名(形式参数);
- 注意!这里有分号!
- 原因是形式参数里面没有具体的变量名称,只需要类型
- 目的是让程序进行预备
- 如果函数在调用前遇到了原型,编译器会创建一个隐式声明(也说明函数声明的重要性!)
- 如果函数在调用前没有遇到原型,编译器会执行默认的实际参数提升
- static int a;
- register int a;
- extern 外部变量名字;
- 代表作用域效果从上一行开始
- 再正式定义外部变量
- 然后以下的范围都可使用
- 日后测试完善(少用为好)
- 加了static变为静态外部变量后,不可用extern扩大其范围
- (const int【】){1,1}
- return 表达式;
- 首先必须是在main函数中!
- #include<stdlib.h>
- exit(表达式);
- return 0;可以变为exit(0);
- 也可以用exit(EXIT_SUCCESS);
- exit(EXIT_FAILURE);
- 把循环转移到循环体末尾之前
- 但是没有跳出循环!
- while (…) { while (…) {
- … …
- continue; goto end;
- … …
- } end: ;
- }
- 标识符:语句
- goto 标识符;
- short int:%hd
- int:%d
- long int:%ld(C99可以%lld)
- float:%f,常量末尾加f
- double:%lf,末尾加F
- long double:%lf,末尾加L
- 注意!只能在scanf中使用l,不能在printf函数格式串中使用
- long double中scanf和printf都放%Lf
- 显示格式:
- char sb;
- sb=\'a\'
- sb=\' \'
- (类型名)表达式
- typedef 类型 名字;
- 名字 变量,变量,变量;
- 更容易理解,更有实际意义,容易修改,直接改定义处的类型
- 类型定义比宏定义强大,宏定义还不能定义数组和指针。
- sizeof(类型名)
- 这个运算符允许程序储存指定类型值所需的空间的大小
- 类型 名字【大小】{个体表示,个体表示};
- 效果:把字符串2接到1的后面
- 字符串1一定要够大!
- 83.rcpy(字符数组1,字符串2)
- 效果:把字符串2复制到字符数组1中
- 字符串2也可以是字符数组
- 够大!
- strcmp(字符串1,字符串2)
- 从左往右比较不同元素,随ASCII码大的为正
- 若两个字符串相等,为0
- 小于为负
- strlen(字符数组)
- 测量长度
- 不包含\'\0\'
- 效果:将字符串转化为小写
- 效果:将字符串转化为大写
- 1.int i;
- 类型 *p,*q;
- p=&i;
- q=&j;
- *(p+i)表示数组p的第i个元素
- int(*p)(int)
- p=f(函数入口)
- 这是一个指向整形函数,并且这个整形函数还有一个整形参数的函数
- 调用形式为:
- a=(*p)(n)
- (*p)(n)等效于f(n)
C语言笔记
-
因为默认main为int所以可以直接:
-
main(){
-
…
-
}
函数定义不可嵌套
运算符%%只能用于整数操作
%%要双标记才能打印
判等与赋值一定要区分
不可以在同一个地方,访问和修改同一个数的数值
负数操作运算符“/”、“%”时,C89和C99都要确保一个神奇的公式:(a/b)*b+a%d=a
变量是左值
if(表达式){语句;}
if(表达式){语句;}else语句
if的用法:
-
if(表达式){语句;}
-
else if(表达式){语句;}
-
else if(表达式){语句;}
-
else{语句;}
条件表达式:
-
表达式1?表达式2:表达式3
-
表达式1成立计算表达式2的值
-
表达式1不成立计算表达式3的值
switch结构:
-
switch(表达式){
-
case 表达式1: case 2: case 3:
-
语句;break;
-
case 表达式4:
-
语句;break;
-
default:语句;break;
-
}
else语句属于离他最近的且还未与其他else配对的if语句
循环中
-
while用于循环体执行之前检验
-
do用于循环执行之后检
-
for用于递增或递减计数变量的循环
-
continue语句仅在循环可用
while循环:
-
while(表达式)表达式不为0即执行
-
{语句;}
-
如果一来就为0,会一次都不执行直接跳出循环
while(1)是一种常用的无限循环语句
do循环:
-
do{语句;}while(表达式);
-
先执行循环,再判定
-
至少执行一次循环
for循环:
-
for(表达式1;2;3)
-
表达式1用来赋初值(循环执行前)
-
表达式2用来控制循环终止
-
表达式3(循环执行后执行)
-
可以等价于
-
表达式1;
-
while(表达式2){
-
语句
-
表达式3;
-
}
必须有两个分号,表达式1都可以挑出来表达之后省略(;2;3)
形式参数定义时!每个形参前必须都有其类型说明
函数定义:
-
返回类型 函数名(形式参数)
-
{
-
声明;
-
语句;
-
}
-
(花括号内的称为函数体)
函数调用:
-
函数名(实际参数);
函数声明:
-
返回类型 函数名(形式参数);
-
注意!这里有分号!
-
原因是形式参数里面没有具体的变量名称,只需要类型
-
目的是让程序进行预备
-
如果函数在调用前遇到了原型,编译器会创建一个隐式声明(也说明函数声明的重要性!)
-
如果函数在调用前没有遇到原型,编译器会执行默认的实际参数提升
无实参的函数要调用也必须有()
非void函数必须用return语句来指定返回值
void类型函数没有返回值
若省略返回类型,C89会自动变为int,C99中不合法
把数组名传递给函数时,数组名后不加方括号!
利用数组型实际参数可以控制数组的有效性,把无效部分在后期删去!!!
声明多维数组的形式参数时,声明可以省略第一维的长度(例如二维数组,可以不说行数,但是必须制定列数)
变长数组声明时必须先长度参数,再数组,要让代表数组长度的参数先被程序看见
也可以用*替换数组内的长度参数,*直接代表数组长度与形参列表中的前面的参数有关
static可以在数组参数声明中使用C99
int a【static 3】代表数组长度至少为3
多维数组的话static仅可用于第一维
静态局部变量static可以在局部变量的值调用结束后,而不释放,保存原值。
-
static int a;
寄存器变量(register变量)代表允许将局部变量的值放在cpu中提高执行效率
-
register int a;
扩展外部变量的作用域(extern)
-
extern 外部变量名字;
-
代表作用域效果从上一行开始
-
再正式定义外部变量
-
然后以下的范围都可使用
-
日后测试完善(少用为好)
-
加了static变为静态外部变量后,不可用extern扩大其范围
复合字面量是通过指定其包含的元素而创建的没有名字的数组(int 【】){…}
可以使用const把数组变为只读
-
(const int【】){1,1}
return语句:
-
return 表达式;
在main函数中也可以用exit来等价替换,形式如下:
-
首先必须是在main函数中!
-
#include<stdlib.h>
-
exit(表达式);
-
return 0;可以变为exit(0);
-
也可以用exit(EXIT_SUCCESS);
-
exit(EXIT_FAILURE);
continue语句
-
把循环转移到循环体末尾之前
-
但是没有跳出循环!
continue与goto等效替换
-
while (…) { while (…) {
-
… …
-
continue; goto end;
-
… …
-
} end: ;
-
}
break语句
可以跳出循环
一个break只能跳出最近的一层
goto语句
使用模版:
-
标识符:语句
-
goto 标识符;
可以任意跳跃!直接跳出多重循环!
所以优点也是缺点,很容易创造垃圾代码
空语句最好单独放置在一行,或者用continue;语句或者还可以用{}凸显一下
空循环一般仅只是用于增加简洁度,而不会提高效率
素数判断可以只检查不大于n(你输入的检验数)的平方根 的除数
十进制不可以0开头
八进制通常以0开头
十六进制通常以0x或0X开头
有符号整数类型
-
short int:%hd
-
int:%d
-
long int:%ld(C99可以%lld)
浮点类型
-
float:%f,常量末尾加f
-
double:%lf,末尾加F
-
long double:%lf,末尾加L
-
注意!只能在scanf中使用l,不能在printf函数格式串中使用
-
long double中scanf和printf都放%Lf
字符操作
-
显示格式:
-
char sb;
-
sb=\'a\'
-
sb=\' \'
字符常量使用时,转义序列必须用一对单引号括起来:\'\33\'
getchar返回的是int型的值,尽管它读入和返回的是字符
%s不能有空格
使用getchar时必须打括号!!!!!曹尼玛!
类型转换有隐式转换和显式转换
常用的算术转换的策略是整值提升
强制转换表达式:
-
(类型名)表达式
类型定义:
-
typedef 类型 名字;
-
名字 变量,变量,变量;
-
更容易理解,更有实际意义,容易修改,直接改定义处的类型
-
类型定义比宏定义强大,宏定义还不能定义数组和指针。
sizeof表达式:
-
sizeof(类型名)
-
这个运算符允许程序储存指定类型值所需的空间的大小
C语言有两种聚合类型:数组和结构
数组:
-
类型 名字【大小】{个体表示,个体表示};
数组可以通过在类型名前面加const变成常量数组
声明为常量数组的数组不会被程序修改,编译器也能发现那些有修改他意图的代码
C99可以使用变长数组,即使用非常量表达式
变长数组的限制在于无初始化值和静态存储期限
在局部变量声明中放置static可以使变量具有静态存储期限,即拥有永久的存储单元,即使函数返回,也不会失去他的值。
-
#define N n等效于sizeof(a)/sizeof(a【0】)
-
这是为了解决可能忘记名字的问题
-
也可以二者直接组合定义
-
#include<string.h>
-
gets(数组) and puts(数组)
-
strcat(字符数组1,字符数组2)
-
效果:把字符串2接到1的后面
-
字符串1一定要够大!
strcpy(字符数组1,字符串2)
-
效果:把字符串2复制到字符数组1中
-
字符串2也可以是字符数组
-
够大!
strcmp(字符串1,字符串2)
-
从左往右比较不同元素,随ASCII码大的为正
-
若两个字符串相等,为0
-
小于为负
strlen(字符数组)
-
测量长度
-
不包含\'\0\'
strlwr(字符串)
-
效果:将字符串转化为小写
strupr(字符串)
-
效果:将字符串转化为大写
指针就是地址,指针变量就是储存地址的变量
指针变量的声明:
-
1.int i;
-
类型 *p,*q;
-
p=&i;
-
q=&j;
&:取地址符(&x就是x在内存中的地址)*:间接寻址符(*p就是i的别名,改变*p的值也会改变i的值)
对变量使用&会产生指针
对指针使用*会返回变量
q=p是把p的内容(i的地址)给了q,即把q指向了p所指向的地方
*q=*p是把p指向的值(i的值)复制给q指向的对象(j的值)
const保护参数:说明p是指向“长整数”的指针。表明函数不会改变指针参数指向的对象。
数组指针的元素可以
-
*(p+i)表示数组p的第i个元素
p+i实质为p+i*(元素所占字节)还是位置
多维数组中a【1】+1等价于*a(a+1)+1,都表示了a【1】【1】
指向函数的指针:
-
int(*p)(int)
-
p=f(函数入口)
-
这是一个指向整形函数,并且这个整形函数还有一个整形参数的函数
-
调用形式为:
-
a=(*p)(n)
-
(*p)(n)等效于f(n)
一种单项链表编法
-
辗转相除法
-
用(a,b)表示最大公约数
-
若a%b=c,则(a,b)=(b,c)
-
一些常用的函数
-
除法:sqrt
-
pow(x,y) x的y次方
-
字符串拼接:strcat(数组1,数组2)
-
字符串比较:strcmp
-
字符串复制:strcpy
-