目录
2.基本控制语句
3.指针
c语言三大基本控制结构
一 ,选择语句
1.C语言程序有顺序、选择(分支)、循环(迭代)3种基本控制结构,实现程序代码顺序执行、判断选择执行、循环执行控制。程序代码默认是顺序执行。
2. goto语句也可以认为是一种控制结构,在函数内任意跳转。最常用的就是顺序结构,因为C语言程序默认就是顺序执行,因此无需特殊语法控制。
3.选择语句要求程序测试条件,当条件为真时,选择执行部分语句,当条件为假时,选择执行另一部分代码。
4.C语言把条件中的表达式值非0值判断为真,0或NULL判断为假。
5.选择结构中的关系运算 :c语言提供六种关系运算符;
C语言选择语句包括:
•条件运算符 ?:
•if,if...else 以及if嵌套语句
•switch语句以及其嵌套语句
条件运算符 ?
语句语法形式:条件表达式1 ?: 表达式2 : 表达式3;
当条件表达式1为真时,执行表达式2,否则执行表达式3。
例如:判断两个数的大小,输出大的数
#include <stdio.h>
int main(void)
{
int a=1,b=2,c=3;
(b >= a) ? printf("%d\n",b) : printf("%d\n",a);
(b >= c) ? printf("%d\n",b) : printf("%d\n",c);
return 0;
}
二,if语句
1.if语句的三种形式:
——if语句 单分支结构
——if...else语句 双分支结构
——if...else if...else语句 多分支结构
2.if语句有简单的if语句(无else),if...else语句,以及嵌套if语句形式。
简单if语句:
if(表达式) 语句1;
if(表达式) {
语句1;
语句2;
...
}
注:多条语句需要执行,需要使用{}
if...else语句:
if (表达式) 语句1; else 语句2;
if (表达式) {
语句1;
语句2;
...
} else {
语句3;
语句4;
...
}
例:判断分数是在哪个水平的区间,天才,优秀,良好,正常,及格,不及格。
#include <stdio.h>
int main(void)
{
int score=95;
if (score >= 60)
{
printf("及格!\n");
// 进一步判断处于什么水平
if(score == 100)
printf("天才!\n");
else if(score >= 90)
{
printf("优秀!\n");
}else if(score >=80 )
{
printf("良好!\n");
}else
printf("正常!\n");
}else
{
printf("不及格!\n");
}
return 0;
}
三 ,switch语句
switch(整型表达式) {
case 整型常量表达式1:
语句1;
...
break; // 可选,跳出switch
case 整型常量表达式2:
语句2;
...
break; // 可选,跳出switch
...//
default : // 默认执行语句,可选,当没有任何case符合时执行
语句 3;
}
*在使用switch语句时应注意以下几点:
1. 表达式的值为整数、字符、枚举类型。
2.常量表达式的值必须互不相同,否则会出现分支矛盾的现象。
3.case后面的常量表达式只起标号作用,而不起条件判断作用,即“只是开始执行处的入口标号"。一般情况下需用break语句跳出switch语句。
4. 语句块可以是一条语句,或复合语句,可以不用花括号{}。
5.各个 case 和 default 出现的先后次序,并不影响执行结果,习惯上将default子句放在switch的末尾。
6.多个case标号可共用一组执行语句。
switch(表达式)
case 常量表达式1: case 常量表达式2:
case 常量表达式3:语句1;break case 常量表达式4: 语句2; break
注:break;跳出switch不再执行后面语句,没有break会继续执行后面case语句。
四,基本控制语句
五, 循环语句
1.语句是顺序执行,每条语句只执行一次,循环语句实现多次执行同一段代码,用来完成多次相同的操作。
2.循环语句有以下几类:
•while(表达式){循环体}:表达式非0为真,执行循环体
•for循环
•do...while循环
•嵌套循环:三种循环方式可以任意嵌套
•无限循环
六, 无限循环实现的三种方式
for(;;){
}
while(1){
}
do{
}while(1);
//可以设置条件,使用break结束无限循环
例 :实现读取输入的字符
#include <stdio.h>
int main(void)
{
char c;
for (;;)
{
scanf("%c", &c);
printf("%c\n", c);
}
return 0;
}
七,while, do...while... ,for循环
1.三种循环方式等价,这里以一个程序用三种方式写实现相同功能。
例:while 实现1-100所有整数之和。
#include <stdio.h>
int main(void)
{
int sum = 0, i = 1;
while (i <= 100)
{
sum += i;
i++;
}
printf("%d\n", sum);
return 0;
}
八,嵌套循环
一,多重for循环:
for(...) {
for(...) {
......
}
}
二,while,for循环嵌套:
while(...) {
...
for(...) {
while(...) {
}
}
do {
}while(...);
}
九,指针
1.C语言指针是一种派生类型,指针变量的值是计算机内存的地址,C语言语法规定使用 & 获取变量的内存地址,用 * 获取指针变量所指向内存里面的值。
注:C语言中,任何类型包括函数类型(函数指针)、指针类型本身(指针的指针,多重指针),都可以派生指针类型。
2.计算机内存可以看做许多字节单元组成的,按照字节编址,每个字节都有固定的地址,例如32位机器内存地址空间是2的32次方,也就是4GB大小,地址范围0x0000000-0xffffff。简单理解是每个字节单元是房间,每个地址是房间号,房间号从0开始编号,房间里面存放变量的真正的值。
3.变量分配地址一般从低地址编号到高地址编号,内存地址一般习惯使用十六进制表示,方便与二进制转换。
十,声明指针变量
指针变量和整型变量、浮点变量一样,需要声明和初始化使用。声明语法:
// 声明指向char型的指针变量cp
char *cp;// 声明指向int型的指针变量ip
int *ip;// 声明指向float型的指针变量fp
float *fp;
注:不同数据类型的指针变量的值都是地址常量,只不过其指针地址所指向的变量数据类型是不同的。
十一,指针初始化和赋值
和普通变量一样,指针变量同样可以初始化和赋值。
例如:声明和初始化基本数据类型的指针变量。
char c='a';
// 获取变量c的值赋值初始化字符指针cp
char *cp = &c;
int i= 1000;
// 获取变量i的值赋值初始字符指针ip
int *ip = &i;
float f = 1.01f;
float *fp = &f;
double d = 1.01;
double *dp = &d;
十二,指针变量使用
指针变量使用有两种,一种是输出指针变量的值(地址),一种是访问指针变量所指向变量的值。
注:指针变量的值本质上是无符号整数,因此可以进行加减运算。
例如:
#include <stdio.h>
int main(void)
{
int i = 1000;
int *ip = &i;
// 输出指针变量ip的值
printf("%p\n", ip);
// 直接通过变量名称输出变量i的值
printf("%d\n", i);
// 间接通过指针变量输出变量i的值
printf("%d\n", *ip);
return 0;
}
十三,地址变量和空指针
1.NULL是C语言规定的空指针常量,可以赋值初始化任何类型的指针变量。
2.指针变量的值本质上是无符号整型,因此可以通过强制转换将整型常量赋值给指针变量。
3.NULL空指针是C语言保留用来检测指针是否正常的,空指针不指向任何位置,访问值为空指针的指针变量所指向的数据时会报错。
4.检查指针是否为空,可以用语句,因为指针变量值本质上可以看做是无符号整数,
十四,指针的运算
1.指针变量的值本质上是无符号整型,因此可以通过强制转换将整型常量赋值给指针变量
2.指针(地址)支持加减、自增、自减,支持关系运算(大于小于等于),因为指针的值本质上就是无符号整数。
十五,数组
int *p = (int*)0;
// p指向下一个int,地址值+4,int型占4个字节
// 此时p的地址值为4
p ++ ;
// p指向前一个int,地址值-4
// 此时p的地址值为0
p -- ;
// p赋值为空指针
p == NULL
注:*p++ *p-- 是指p指向的变量值本身加减运算,而不是指针地址运算,因为*p的运算符优先级更高。