分享

【C语言】C语言基础知识概念

 jamfoot 2017-05-19

目录:


一、 常量

二、 标识符

三、 变量

四、 表达式

五、 输入输出函数

六、 C语言的语句

七、 C程序的基本结构

八、 选择结构语句

if(表达式语句else 语句2

条件运算符 表达式1? 表达式表达式3

switch语句

九、 循环结构

for循环语句

while循环语句 do while循环语句

十、 数组

十一、 字符串函数

十二、 函数

十三、 指针

十四、 宏定义

十五、 结构体,共用体,枚举类型


=================================================================================================

 


一、 常量


 数字常量 

i. 普通数字1352.7

ii. 指数形式2.45e-2等价于2.45*10-2 注意e大小写皆可e前面的数字不能省,就算是1也不能省,后面的数字一定要是整数

iii. 长整型,单精度浮点型3235L32.5F 分别表示3235是长整型数据,32.5是单精度浮点型左,若不写上LF则表示3235是整型,32.5是双精度浮点型,LF大小写皆可

 字符常量

iv. 普通字符常量:用单引号把一个字符括起来,如A,@

v. 转义字符常量:一对单引号括起来并以\开头的字符序列,如\n(回车)\123(8进制123对应的字符), \x23(16进制23对应的字符)

 字符串常量

用一对双引号把一个字符序列括起来,如“ABCef”, 系统存放字符串常量,每个字符分配一个字节,各字符所占字节紧邻,并且字符串末尾会给再开一个字节里面放一个\0做为结束标志

 符号常量

定义格式 #define 符号常量名 符号常量值,如#define 20则定义了符号常量N,其值为20注意符号常量名和符号常量值之间是用空格隔开,而不是写上=号,#define和符号常量名之间也有空格的

 题目P71567910




二、 标识符


 命名规则

以数字,字母,下划线这三类字符组成,但只能以字母或下划线开头,而不能也数字开头,另外不能将关键字做为标识符32个关键字表在P365附录B

 变量名,函数名,符号常量名全都是标识符

 题目:P7234


三、 变量


 变量的定义格式

类型名 变量名;

如 int  a;定义了一个整型常量a。变量名是由人类随便定义的,符合命名规则的前提下,爱写啥就写啥。所以什么flagccy1或者函数名fun,find等全部是自定的用来做为名字而已,没有更特别的意义。

 类型名

int 整型,long 长整型: 用于存放整数,只是数值范围不同

float 单精度浮点型 double 双精度浮点型:用于存放实数,数值范围,精度不同

char字符型:用于存放字符

 变量赋值,初始化

int  a=3;定义的同时初始化

a=6*9;定义后在程序中进行赋值

 变量的值

只有在赋值操作时才会被改变,即将其放在等号左边时才会改变它的值,或自增自减操作a=5,a++,a--,像a+3并未改变a的值,只是使用了a的值而已.

 自增自减运算

变量++,++变量,变量----变量  使变量的值自增1或自减1

等价于 变量=变量+1  变量=变量-1

++--放于变量前后效果的区别:

当自增自减运算做为表达式的一部分时,++,--放在变量前面是先自增自减再使用变量的值,放在变量后面则是先使用变量的值,再自增自减

x=3; printf(%d,++x);则相当于执行了++x; printf(%d,x);这样的操作所以打印出4

再如x=3; printf(%d,x++);则相当于执行了printf(%d,x); x++;这样的操作,则打印出3,当然最后x的值还是4


四、 表达式


 运算符和运算对象

一个运算符都有若干个运算对象,如 必然要跟两个运算对象才能进行加法运算:3+5C语言里称需要跟n个运算对象的运算符为n元运算符。

一元运算符有!,(类型名)

二元运算符有+,-,*,/,%(求余), =,+=-=*=/=,%=,< <=, >=, =(等于), !=(不等于)&&(||()

多元运算符有: 

 运算符的优先级和结合性

i. 优先级同一个运算对象左右两边若同时有两个运算符,则这两个运算符优先级高的先进行运算。

ii. 结合性若同一个运算对象左右两边的两个运算符优先级相同,则根据结合性判断先进行哪个运算,自左自右结合性的先算左边的运算符,自右自左的先算右边的运算符。

iii. 各运算符的优先级和结合性见P365附录C

 强制类型转换

格式: (类型名表达式 将后跟的表达式的值的数据类型转换为与圆括号内的类型名一致的类型。注意类型名一定要用() 括起来

 算术表达式

iv. 算术运算符+,-,*,/,%(求余)

v. 由算术运算符加上运算对象构成算术表达式,3+3*6-9/2

vi. :跟我们小学时学的一样,就是表达式的计算结果

vii. 整数除以整数结果取整数部分,故1/3得到的值是0

viii. 5%3 结果为2,想想小学除法,求余得到的是余数不是商。

 赋值表达式

ix. 赋值运算符=+=-=*=/=,%=

x. 赋值表达式:变量=表达式,如x=3+6x+=6-9x+=x*=3+4 注意等号左边只能是变量

xi. 复合赋值运算符的运算:以/=为例:x/=表达式 等价于 x=x/(表达式)

xii. =号左边的变量最终的值

 关系表达式

xiii. 关系运算符<=, >=, =(等于), !=(不等于)

xiv. 由关系运算符加上运算对象构成关系表达式,3>=4, 2==a

xv. :满足相应运算符所指定的关系的值为1,否则为0

 逻辑表达式

xvi. 逻辑运算符&&(||(!()

xvii. 由逻辑运算符加上运算对象构成逻辑表达式,3&&4, x||!y

xviii. :满足相应运算符所指定的关系的值为1,否则为0

xix. 进行 ||或 运算时,若||左边的表达式值为1,则不再对右边的表达式进行运算。

xx. 进行 &&且 运算时,若&&左边的表达式值为0,则不再对右边的表达式进行运算。

 逗号表达式

xxi. 逗号运算符: 

xxii. 用逗号将各种表达式连续起来构成逗号表达式,如3+4,a=9,8*a

xxiii. :组成逗号表达式的各个表达式中的最后一个的值,如上例为8*a

 题目:P711~17  P818~33



五、 输入输出函数


 scanf(格式控制串,变量地址表列);

scanf(%d%c%d,&a,&ch,&b);    scanf(O,&x);

注意:

i. 格式控制串可控制截取用户输入的前几个字符给变量,但不能控制输入几位小数给变量,如不能写成scanf(%4.2f,&x);

ii. 第二个参数给的是地址,即要么是&+变量名或数组元素名的形式,要么就是一个数组名或指针变量名,如int *p,a; p=&a; scanf(%d,p);

iii. 考试时注意看题目给你写好的scanf的格式

1. 若其格式控制串内各格式符用“,”隔开如scanf(%d%c%d,&a,&ch,&b);那输入时也要用逗号隔开,如此例输入时应:3,+,5

2. 若是这种格式scanf(%d %d,&a,&b);则输入时应:5;

3. 若是这种格式scanf(%d%c%d,&a,&ch,&b);则输入时应3+5,若写成5a=3,ch=‘ (空格)b=任意值      (自己上机运行看看结果)

 printf(格式控制串,输出项表列);

float x=7.5; printf(%8.2f,x);此处的意思是将x打印出来,且占8列,保留两位小数。自己上机运行看看效果。

 常用格式符汇总:

iv. %d:输入输出整型数据,%ld:输入输出长整型数据

v. %c:输入输出字符型数据

vi. %f:输出单(双)精度浮点型数据,输入单精度型数据。            %lf:输入双精度型数据

vii. %s:输入输出一个字符串,用printf输出字符串时,输出项书写时可为字符串常量,或字符数组名。如printf(%s,hello);char str[10]=helloprintf(%s,str);

viii. %u输入输出无符号整型,%o:输入输出八进制数,             

%x:输入输出十六进制数

 getchar();

函数调用后返回用户输入的一个字符,故需再定义一个变量来存放这个字符,即使用时应 char c; c=getchar();意思就是接收用户输入的一个字符,并将其赋值给变量c

 putchar(字符常量或字符变量名)

char c=Aputchar(c);putchar(A);都会向屏幕输出字符A



六、 C语言的语句


 表达式语句:由表达式末尾加上分号构成。

 函数调用语句:由函数调用表达式加上分号构成。

 空语句: 

 选择结构语句if语句 switch语句

 循环语句for语句 while语句 do while语句

 复合语句:用花括号{}将以上任意语句括起来构成一条复合语句。



七、 C程序的基本结构


void main()

{  声明部分:用来定义变量和声明自定义函数的原型,需以“;”结尾,如int x;

   执行语句部分:第六点里介绍的各种语句,如x=3printf(%d,x);

}

main函数外可写自定义函数。如

int max()

{

   return 0;

}



八、 选择结构语句


 if(表达式语句else 语句2 

如果if语句的圆括号内的表达式值为非0,则执行语句1,值为0则执行语句2

i. 表达式可为任意表达式if语句执行的实质是判断表达式的值是否为0来决定执行语句1还是语句2另外请在此处表达严重关切,不管是高手还是菜鸟经常会把判断两个数相等的符号“==”写成了一个等号“=”成为了赋值运算,这样的写法不会引发编译错误,但结果会与原意大大不同,所以考试前请再三提醒自己。

ii. 语句1和语句2都只能是一个语句若要跟多条语句,切记用一对{}括起来,构成复合语句;也不要随便在圆括号后加“;” ,因“ ;”构成一条空语句,这会使后面跟的语句1不再属于if语句的组成部分

iii. if语句的三种结构

1. 单边: if(表达式语句

2. 双边if(表达式语句else 语句2

3. 多层(重点掌握)

if(表达式1) 语句

else if(表达式2) 语句

else if(表达式3) 语句3

else 语句n

 条件运算符 表达式1? 表达式表达式3 

若表达式1的值非0,则取表达式2的值做为整个表达式的值,否则取表达式3的值为整个表达式的值。如 3>4? 1:2  该表达式的值为2

 switch语句

switch(表达式)

{

case 表达式1:语句

case 表达式2:语句

case 表达式n:语句

default: 语句

}

语句执行过程:先计算表达式的值,然后判断该值与表达式1到表达式n中的哪个相等,若与表达式i的值相等,则执行表达式i后的所有语句,当遇到break;语句时结束整个switch语句的执行。表达式1到表达式n的值都不相等的情况下执行default后跟的语句。每个case后可跟多条语句。


九、 循环结构


 for循环语句

for(表达式1;表达式2;表达式3) 循环体语句

语句执行过程:

1. 计算表达式1

2. 判断表达式2的值是否为0,若为0,语句执行结束,若不为0,进入步骤3

3. 执行循环体语句(需注意的是循环体语句只能有一个语句,若要包含多个语句要用一对{}括起来,构成一条复合语句,此处也不要随便加上  ,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于for循环语句的部分)。进入步骤4

4. 计算表达式3,然后重新进入步骤2

 while循环语句 do while循环语句

i. while(表达式循环体语句

执行过程:

1. 判断表达式的值是否为非0,若是进入步骤2,否则结束语句执行。

2. 执行循环体语句,重新回到步骤1

ii. do  循环体语句  while(表达式)

执行过程:

1. 执行循环体语句,进入步骤2

2. 判断表达式的值是否为非0,若是重新回到步骤1,否则结束语句执行。

 

这里要注意的地方跟for语句一样,即循环体语句只能有一个语句,若要包含多个语句要用一对{}括起来,构成一条复合语句,此处也不要随便加上  ,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于while循环语句的部分,另外do while循环的while(表达式)后是要加“;”的。

 break语句放在循环体内实现的功能是结束其所在的那层循环的执行



十、 数组



 定义格式数据类型   数组名[整型常量]如 int a[10]; 定义了一个整型数组,数组名为a,这个数组含有10个元素。

 引用数组元素: 格式:数组名[下标]   切记下标值从0开始。下标可为常量,表达式,变量等,如int i=3; a[0]=5a[3*2]=9; a[i]=7

 初始化数据类型   数组名[整型常量]={数据表列}将数据表列的各个值依次赋值给数组的各个元素。如int a[5]={0,1,2,3,4};则数组a各元素a[0]a[4]的值分别为01234

 遍历数组元素

数组定义后,我们不能对数组进行整体的操作,如int a[10];不能用a=3这样的操作将数组的各元素都赋值为3;而只能一个一个元素的进行赋值,如a[0]=3;a[1]=3;a[2]=3a[9]=3; 当然此时我们就可以借助于一个for循环来控制下标的变化从而对数组的各个元素进行赋值

for(i=0;i<10;i++) a[i]=3; 

当然这只是用for循环遍历数组各元素的最简单的例子,一般考试考的是找出数组元素的某种特性的极值,比如最大值,最小值,或对数组各元素进行排序,这时我们就可以使用for循环来遍历数组的各元素,然后在当前循环中得到一个元素再对其进行处理。如i=2时访问到的元素是a[2],你就可以问问它,你是不是最小值啊。

 整型数组

int a[10]; 整型数组里的各个元素存放的是整数。a[3]=3;

 字符型数组

char  str[20];字符型数组里的各个元素存放的是字符。   str[3]=A;



十一、 字符串函数 



 gets(字符数组名或字符指针变量)

char str[10],* str2; str2=str;gets(str);或gets(str2);都是接收用户输入的字符串如“ABC”存入到字符数组str

 puts(字符数组名或字符指针变量或字符串常量)

char str[10]=china; char *str2;str=str2;  puts(str); puts(str2); 或 puts(china);都会在屏幕上打印出 china

 strlen(字符数组名或字符指针变量);字符串测长函数

char str[20]=hello world! 

int len;len=strlen(str);得出的结果是len的值为12

 strcat(字符串1的地址,字符串2的地址)

将字符串2的内容连接到字符串1的尾部。

char str1[20]=ABC,str2[20]=xyz

strcat(str1,str2); 

则程序运行的结果是str1内存放的字符串变为ABCxyz,当然str2存放的字符串还是xyz

 strcmp(字符串1的地址,字符串2的地址)

比较串1和串2哪个比较大。比较大小的依据是,两个字符串从左往右相应位置上第一个不相等的字符ASCII码值之差。

char str1[20]=ABCE,str2[20]=ABDE

int i;

i=strcmp (str1,str2);

第一个不相等的字符为str1的‘C’和str2的‘D’,而二者相差-1,故-1做为strcmp函数执行的结果返回到被调用的位置,该位置位于赋值表达式内,故将其值赋值给i,即此时i的值就是-1.

 strcpy(字符串1的地址,字符串2的地址)

将字符串2的内容复制到字符串1内。

char str1[20]=ABC,str2[20]=xyz;

strcpy(str1,str2);此时str1的内容为xyz,当然str2的内容没变

strcpy(str1,uvw);此时str1的内容又变成了“uvw“。



十二、 函数



 函数定义

函数类型  函数名形式参数列表 )

 {

        内部变量定义和声明部分

     执行语句

 }

如:

int  max (int  int  )

 int  ;

    z=  ;

    return  ;

}

注意点:

1.函数类型是指返回值的类型,即要与return语句后跟的表达式的值的类型一致。若函数类型为void则说明该函数无返回值,即函数体里不能出现return 语句

2.形式参数列表里定义的变量要记得给它们指定类型,而且如果同时要定义多个,应在每个前面都分别指定类型名,而不能写成int x,y;

3.函数体里能写的语句跟main函数一样,在开头可定义所需要的变量,后面跟上一堆执行语句。

 函数调用流程

以上面的函数为例,在main函数进行调用:

void main()

int a,b,c;

  scanf(%d%d,&a,&b);

  printf(%d,max(a,b));或 c=max(a,b);printf(%d,c)以上两种方法都会在屏幕中打印出a,b间的较大值。

调用函数的格式 函数名(实际参数列表)调用的时候像什么函数类型,形式参数的类型就不要加上去了。max(a,b)中max就是函数名,写上变量名a,b是实际参数列表,执行这个调用语句时,会先把a,b的值给相应位置的形式参数即执行了x=a,y=b这样的操作,然后开始执行max函数的函数体的语句。当max函数体里执行到一个return语句时,则max函数结束执行,将return后的表达式的值返回给main函数调用max函数的那个位置,即若上面a=3,b=5则max(a,b)return后的表达式的值应该是5也就是说执行完max后把5返回到调用max的位置可看成printf(%d,5);或另一种解法的c=5。

}



十三、 指针


 指针变量的声明: 类型名 指针变量名;

 通过指针变量访问它所指向的普通变量的值

先将普通变量的地址赋值给指针变量,再通过指针运算符得到普通变量的值。

int *p,x,y;

x=3;

p=&x;

printf(%d,*p);会打印出3x的值

y=*p;则y的值变为3

*p=5;则x的值变为5

 指针变量加上(减去)一个位移的效果

若指针变量存入的是数组元素的地址,则其加一减一得到的是那个数组元素下一个或前一个元素的地址

int a[10]; p=&a[3];

*p得到的是a[3]的值。

p++;此时p存放的是a[4]的地址&a[4]; *p得到的就是a[4]的值。

p--;此时p存放的是a[2]的地址&a[2]*p得到的就是a[2]的值。

 行指针

i. 主要是对于二维数组来说的,二维数组每行都有自己的地址,第0行地址用 数组名 表示,第i行地址为 数组名+i;而想要得到二维数组里一个元素的地址,必需先得到其所在行的地址,然后再由那个地址得到元素的地址,比如说 int  a[3][4];定义了一个二维数组,该二维数组第0行的地址为a,第1行的地址为a+1,第2行的地址为a+2想从行的地址得到元素的地址,需在行地址前加上指针运算符“*,即*a就是第0行首个元素的地址即a[0][0]的地址,而a[0][2]的地址就是在a[0][0]的地址基础上加上位移量2,即*a+2,然后想得到a[0][2]这个元素的值呢就再加上一个指针运算符“*”,即*(*a+2),类似地,想得到a[2][2]这个元素的值呢就是*(*(a+2)+2)

ii. 定义行指针变量: 类型名  *变量名)[数组长度]

int (*p)[4],a[3][4]; p=a;此时就可把p当成a来用,用法同上所述。

 判断是否合法访问数组元素:若是指针法访问,判断指针后跟的是否地址;若是下标法访问,判断下标有无越界。

 函数指针:函数名即为函数的地址(指针)

iii. 函数指针变量的定义: 类型名 (*变量名(形参列表);如 int (*p)();

iv. 赋值:指针变量=函数名;设有个函数其函数名为max,则要将该函数的地址给p的话只要执行如下语句即可 max;

 指针数组:指针数组的数组元素都是指针变量,是用来存放变量的地址的,定义格式为 类型名 变量名[数组长度]; int p[10];

 指向指针的指针:指针变量也是一种变量,故在内存中也有对应的一个地址,而要存放指针变量的地址,就要求助于用来存放指针变量的地址的指针变量,定义格式  类型名 ** 变量名;如 int *p1; int **p2; int a=3;可进行赋值p1=&a; p2=&p1; *p1和 **p2的值都是3.


十四、 宏定义


 无参宏定义 #define  标识符     定义后,出现所定义的标识符的地方都将以定义时指定的值来代替。

#define   2+3

main()

 int x;

   x=M*M;  x的值为2+3*2+3=11若想得到的结果是(2+3)*(2+3)则定义时也写成这样 #define (2+3)

}

注意#define、标识符、值之间都要用空格隔开,且宏定义结尾不需加分号。

 带参宏定义  #define 标识符(参数表 

#define  S(x,y)  x*y

main( )

 int a=3,b=4,c=5,d=6;

    printf("a*b=%d\n", S(a,b));  此时会打印出 a*b=12

    printf("a+b*c+d=%d\n" S(a+b,c+d)); 此时会打印出a+b*c+d=29,带参宏定义执行时是将a+b这样一个表达式代替xc+d这样一个表达式代替y,所以S(a+b,c+d)进行的是a+b*c+d的运算,而不是将a+b的值给xc+d的值给y然后再做x*y这点跟函数调用传递参数是不一样的

}

 自定义类型名typedef:对已存在的类型名取一个外号。

i. 基本格式:typedef  原类型名  新类型名;

ii. typedef  int INTEGERint a,b;等价于INTEGER a,b;

iii. typedef  int  NUM[10]; 则 int a[10];等价于 NUM a; a即为一个有10个元素的数组的数组名。

iv. typedef int INTEGERint *a,*b;等价于INTEGER a,b;



十五、 结构体,共用体,枚举类型


 结构体

i. 结构体类型的定义及变量的定义

struct  结构体名

 {类型 成员1

  类型 成员2

  ……

  类型 成员n

 }变量名;

struct student

 char name[10];

long num;

int score[4];

}st1;定义类型时同时定义变量

struct student st2;定义类型后,用类型名定义变量

还有一种

struct 

 char name[10];

long num;

int score[4];

}st3;不给类型名,直接定义变量

ii. 结构体变量所占字节数各成员各占字节数之和,如以上st1,st2,st3的字节数皆为10+4+2*4=22

iii. 结构体数组的定义及初始化

struct student a[3]={{ "zhang",20030001,89,90,91,92},

            {"liu",20030002,68,69,70,71},

            {"li",20030003,57,58,59,60} 

}

iv. 结构体成员的访问

1. 结构体变量名成员名 st1.name[2]

2. 通过指针访问:struct student *st; st=&st1; (*st).num 或 st->num

 共用体

v. 共用体类型的定义及变量的定义

union  共用体名

类型  成员名1

  

   类型  成员名n 

}

变量的定义与结构体类似,也有三种方法。

union data

{

   int i;

char ch;

float f;

}d1; 定义类型时同时定义变量

union data d2; 定义类型后,用类型名定义变量

union 

{

   int i;

char ch;

float f;

}d3; 不给类型名,直接定义变量

vi. 共用体变量所占字节数各成员所占字节数的最大值,如上d1,d2,d3所占字节数皆为4.(单精度浮点型变量所占字节数最多为4.

vii. 共用体成员的访问

1. 共用体变量名成员名 d1.f

2. 通过指针访问:union student *d; d=&d1; (*d).num 或 d->num

 枚举类型

viii. 枚举类型的定义:                                                  enum 枚举名{枚举元素名1,枚举元素名2,枚举元素名n}

ix. 枚举元素的值:
默认值分别为01n-1枚举元素的值也可在定义时重指定,对于没有指定值的元素,按顺序加1

enum weekday{sun=7,mon=1,tue,wend,thur,fri,sat};sun值为7mon值为1tue值为2wend值为3thur值为4fri值为5sat值为6




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多