目录
短路规则:当有足够条件确定表达式的值后,剩余部分将不再被计算
例:a=2,b=3,c=4;a>1|| b++>2||c--!=0 结果为1,a=2,b=3,c=4
等价:n等价于n!=0 !n等价于n==0
第三章 顺序结构
c语句分为五类:
控制语句 | 函数调用语句 | 表达式语句 | 空语句 | 复合语句 |
C不提供输入输出语句,输入输出是由函数完成。
字符输入函数:
例:从键盘输入一个大写字母,将其转换成小写
#include<stdio.h>
int main(){
char ch;
ch=getchar();
ch=ch+32;
putchar(ch);
return 0;
}
注意:getchar()连续输入多个字符时,中间不能有空格和回车。因为空格也算一个字符
格式输出函数:
格式字符:%d %f %e %c %s %f输出时小数点后自动保留六位
一个整数只要在0~255之间,也可以用字符形式输出。
修饰符:m
数据宽度大于m,按实际宽度输出;小于m时,+m左补空格;-m右补空格
a=1234;
printf("%3d",a); //a=1234
printf("%-5d",a); //a=1234空格
printf("%5d",a); //a=空格1234
修饰符:.n
对实数表示输出n位小数,对字符串表示最多输出的字符个数
f=123.456;printf("%10.2f",f); //f=空空空空123.46 6为四舍五入
a=2;printf("%%%d",a); %%d输出%d,%%%d输出%2
格式输入函数:
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c); //1,2,3
scanf("%d%d%d",&a,&b,&c); //123
注意:除%c以外,其他格式符均忽略前导空白。%c中空格也算一个字符
输入时不能规定精度 scanf("%4.2f",&a); // 错误
第四章 选择结构
if语句:
if(表达式) 语句; | if(表达式1) 语句1; else 语句2; | if(表达式) 语句; else if(表达式2) 语句2; else 语句n; |
语句如果是复合语句要用{}引起来,缺省{}时,else和最近未配对的if配对
switch语句:
switch(表达式)
{case常量1:语句1;break;
case常量2:语句2;break;
case常量3:语句3;break;
default:语句n+1;break;}
第五章 循环结构
goto 语句标号; 标号:语句; | while(表达式) 循环体语句; | do 循环体语句; while (表达式); | for(式1;式2;式3) {循环体语句;} |
for(;;)无限循环,没有终止条件
第六章 函数
函数的定义及返回值:
形参不可以是常量,只能是变量和表达式;
函数分类:
- 用户角度:库函数和自定义函数
- 函数形式:有参函数和无参函数
一般格式:
函数类型 函数名(形参类型说明表)
{
说明部分
语句部分
}
返回值:
- void 无返回值型,返回但无值;
- return 表达式;只能带回一个返回值
- 返回值的类型由在定义函数时所指定的函数类型决定;
函数的调用:
递归调用:函数直接或间接的调用自己,称为函数的递归调用。除主函数外,任何函数都可以递归调用。
函数之间的值传递:(不用做计算)
简单变量做实参是值传递,传递方向为单项。
总结:
- 函数是构成C程序的基本单位,语句是最小单位;
- 一个C语言程序由若干函数组成;
- 主函数的位置是任意的,从主函数开始,同时结束于主函数;
- 实参类型可以与形参类型不一致,以形参的类型为准;
- 实参与形参各占用独立的存储单元;
- 函数应先定义后调用;
- 函数不能嵌套定义,可以嵌套调用;
- 函数默认的类型为int型。
- 函数返回值的类型是由在定义函数时所指定的函类型决定的
- 函数直接或间接的调用自己称为递归调用,分为直接递归和间接递归。
- .main()函数(主函数)不能调用自己,其他函数都可以调用自己。
- 通过return语句,函数只能带回一个返回值;void表示函数无返回值
- 函数的实参传递分为值传递和地址传递。
第七章 数组
一维数组:
数据类型 数组名【常量表达式/常量】; 下标[]从0开始写a[0],a[1],a[2]
数组名表示内存首地址,是地址常量。 int a[5];a为数组名
一维数组初始化:int a[5]={1,2,3,4};未赋值的元素默认为0; {}中至少赋一个值
一维数组的引用:1.数组先定义,后使用2.逐个引用数组元素,不能一次引用整个数组
二维数组:
数据类型 数组名【常量表达式】【常量表达式】;行*列=元素个数
1.排序时按行排序2.分行初始化 3.行可以省略 int a[][3]={1,2,3,4,5,6};
二维数组的初始化:int a[2][3]={{1,2,3},{4,5,6}} ;{}{}两行
第0行第1列 第0行第2列 第0行第3列
1 | 2 | 3 |
4 | 5 | 6 |
int a[2][3]={1,2,3,4,5,6} ;
^3表示3列,所以就分为123/456
第八章 指针与变量
指针:
指针即地址,变量即数值
一、指针的定义
int *t ; *指针说明符(说明t是指针)
二、指针的赋值
1.通过取地址运算符:&
int a,*p=&a;等价于int a,*p;p=&a; *p=a;左加*=右去&
2.通过另一指针
int a,*p,*q;p=&a;q=p;
3.空指针的定义:
int *p=NULL;空指针定义后不能引用。
三、运算符
&:取地址运算符
*:取内容运算符
例:语句int *p;*p=0;存在着潜在的风险。对 步骤:1.定义2.赋值3.引用
四、函数之间的地址传递
实参形参双向,实参地址,形参指针
指针与一维数组:
数组名表示内存首地址 int a[5];a为数组名
- a=&a[0] a+i=&a[i] *(a+i)=a[i]
- 数组名即常量,不能++/--
- 地址可以相减,但不可以相加
对一维数组的引用: a[i] *(a+i)
- 数组元素做实参---值传递
- 数组元素地址做实参---地址传递
- 数组名做实参---地址传递
指针与二维数组:
a是二维数组名,即二维数组的首地址,第0行的地址。
*,[] *,[]
行地址->列地址->数组元素(内容)
*(a+1)+2 :第1行第2列的地址
*(*(a+2)+3) :第2行第3列的内容
a[1]+2 :第1行第2列的地址
*(a[2]+3) :第2行第3列的内容
二维数组的引用:a[i][j] *(*(a+i)+j) *(a[i]+j) (*(a+i))[j]
数组指针: int (*p)[4] 说明:p为类型为int型数组的指针。数组长度为4
指针数组:int *q[3];q[0]、q[1]、q[2]均为int* 说明:q由三个指针变量构成的数组
函数与指针:
函数指针:int (*p)(); 说明:p是返回值为整型函数的指针,函数的类型可以是任何类型
指针函数:int *p(); 说明:p是返回值为整型指针的函数
第九章 字符数组与字符串
字符数组的初始化:1.逐个字符赋值2.用字符串常量
char ch[6]={"hello"};字符串有无{}均可
h | e | l | l | o | \0 |
ch[0] ch[1] ch[2] ch[3] ch[4] ch[5]
字符串结束标志‘\0’,“hello”在内存中占6个字节
char s[5]="ABCD!" ;字符数组,没有\0
A | B | C | D | ! |
字符串指针:char *p="ABCD";首地址A指向p
字符串的输入与输出:char s[]="ABCD";printf("%s\n",s);------ABCD 从A开始输出直到遇到\0停下
字符串数组: char s[][5]={"ABC","DEF"};*p=&s[0][0];printf("%s\n",p+5); -----DEF
P为A,P+5为D,从D开始输出遇零停下
A | B | C | \0 | \0 |
D | E | F | \0 | \0 |
字符串函数:
一、字符串长度函数(strlen)即所占的字节数,不包括\0
注意:\三位数表示一位八进制数
二、字符串复制函数
char s[20]="ABC";
char t[20]="DEF";
strcpy(s,t);//字符串t复制到字符串s中(后者完全替换前者)
printf("%s,%s\n",s,t); ------ DEF,DEF
二、字符串连接函数
char s[20]="ABC";
char t[20]="DEF";
strcpy(s,t);//字符串t连接到字符串s之后(后者连接前者之后)
printf("%s,%s\n",s,t); ------ABCDEF,DEF
三、字符串比较函数
strcmp("ABC","ABB")= 1 A=A,B=B,C>B
串1>串2---1;串1<串2-----负1;串1=串2-----0
数据:scanf|printf 字符:getchar|putchar 字符串:gets|puts
第十章 变量
变量的作用域
一、作用域:变量的有效范围
二、局部变量:在复合语句内部或函数内部定义的变量称为局部变量。作用域:自定义位置起,到复合语句或函数的结束。
三、1.C语言变量按其作用域分为局部变量和全局变量,按其生存期分为静态变量和动态变量。
2.函数的形式参数的作用域为该函数内,全局的外部变量与函数体内定义的内部变量重名时内部变量优先。
变量的存储类
一、自动型:auto (内存中)-----默认类型
auto int a
存储类 类型名 变量名
说明:变量默认的存储类为auto型。
二、寄存器型:register(cpu中)
三、静态型:static(内存中)-----内部变量,内部函数,仅允许当前文件使用
int fun(int n) n=2,s=4
{static int s=2; n=2,s=6 动态可以重新赋值,静态可以累计使用
S+=n;
return s;}
main(){int x=2;
printf("%d\n",fun(x));
printf("%d\n",fun(x));}---------------4,6
静态区:静态局部变量、全局或外部变量初始化在编译,初值为0
动态区:动态变量初值为随机值
静态区生存期:整个程序的结束
动态区生存期:函数调用的结束
四、extern------外部变量,外部函数,允许其他文件使用
第十一章 编译预处理
C语言提供的预处理功能主要有三种:宏定义,文件包含和条件编译。 宏定义不是C语句
一、宏定义
#define 宏名 替换文本
#define 宏名(参数) 替换文本例如:#define N 5
在C语言程序中,符号常量的定义要使用预处理命令。
例:#define k 2+3
k/k=2+3/2+3=2+1+3=6
按宏展开计算