目录
2.5.1 概述、goto、while、do while 语句精解
1. C语言的语句和程序的基本结构
1.2 语句的分类
一行 C 程序 后面是 ;
那就是一条语句。
从 main 开始顺序从上往下执行,C 语言包含其他语句。
- 5类语句:
- 控制语句:控制程序的执行流程,在某个条件下执行某条语句。有9种控制语句
- 函数调用语句:由一个函数调用末尾是
;
的语句 如 printf(); 语句。 - 表达式语句:由一个表达式构成的语句 末尾是
;
如 3+5; - 空语句:就一个
;
没什么用,但是语法是合规的
int a;
a = 3; // 赋值表达式,末尾增加个分号,从而构成一条语句。这也是一条表达式语句。
在 C 语言中 所谓的语句就是后面有 ;
,;
是语句不能缺少的部分。
i = 1 // 表达式
i = 1; // 语句
所以,表达式+ ;
= 语句
// 复合语句如下,{}后面不用加 ;
{
int x1;
x1 = 1;
int y1;
y1 = 1;
}
注意点:C语言 允许在一行上写几个语句。C语言也允许一个语句拆开在几行写,上一行用 \ 结尾,紧接下一行,这两行构成,一个完整行。
int x1; x1 = 1; int y1; y1 = 1;
printf("上面\
下面\n");
=>
上面下面
2. 程序的三种基本结构
-
顺序结构:从上到下操作
-
选择结构:
-
按照条件实现的情况进行对应的操作
- 补充,多分支选择结构
-
- 循环结构:
-
当型循环结构,先判断条件P,才决定是否决定执行A操作,反复的执行A操作,一直到P条件为假的时候才停止循环。程序从下面的出口出去。
- 直到型循环结构,先执行A操作,再判断条件P是否为真,若为真则继续执行A操作,一直到条件P为假。
-
2.1 关系运算符和关系表达式
关系运算其实就是比较运算,将两个值进行比较,判断比较结果是否符合条件。
C 语言中提供了6种关系运算符。
- 优先级相同(高)(关系运算符)
- < 、<=、>、>=
- 优先级相同(低)(关系运算符)
-
==、!=
-
-
算术运算符 > 关系运算符 > 赋值运算符
c > a + b; // c > (a+b);
a > b == c; // (a+b) == c;
a == b < c; // a == (b < c)
a = b > c; // a = (b > c)
关系表达式 的值是一个 逻辑值,逻辑值就是真或者假。
在 C 语言 中,"真" 表示 true 表示,也可以用 1 表示,"假" 用 false 表示,也可以用 0 表示。
true 等于 1,false 等于 0;所以可以认为,关系表达式的值是 0 或者 1,也可以认为表达式的值是 true 或者 false 。
printf("5>3 的值为 %d\n",5>3);
=>
5>3 的值为 1
if (true == 1)
{
printf("true == 1");
}
=>
true == 1
a = 3, b = 2 , c = 1;
(a>b) == c // true == c ===> true
b+c<a // (b+c) < a ===> false,0
2.2 逻辑运算符和逻辑表达式
- 逻辑表达式:
-
用逻辑运算符 将 关系表达式 联系起来。
-
- 逻辑表达式和关系表达式一样,也是 "真","假" 或者 1 和 0。
- !(非) > 算术运算符 > 关系运算符 > && 和 || > 赋值运算符
-
&& 逻辑与 (相当于其他语言中的AND)
-
|| 逻辑或 (相当于其他语言中的 OR)
-
! 逻辑非 (相当于其他语言中的 NOT)
-
-
常见写法 和 特殊写法
逻辑与 、逻辑或 都是双目运算符,双目运算符(有两个运算量位于两侧)
逻辑非 是单目运算符,这个运算分量放在 ! 的后面比如 !(a>b)。
描述:
a && b
: 若a和b都为真,则 a && b 都是真,否则为假。
a || b
:若a和b有一个为真,那么 a || b 都为真,否则为假。
!a
: 若 a 为真,则 !a 为假,若a为假,那么!a 为真。
进行逻辑判断的时候,不等于0的都是认为是真。
if (3)
总的来说,由系统给出的逻辑运算结果不是0就是1,而在逻辑表达式中,作为参加逻辑运算的运算对象,是0就是假,非0就是真。
if (4 && 5) 真
if (3) 真
!a && b || x > y && c
// 表达式从左到右
( ((!a) && b) || (x > y) && c )
常见写法:
(a > b) && (x > y) // a>b && x > y
(a == b) || (x ==y) // a == b || x == y
(!a) || (a>b) // !a || a > b
特殊用法:
实际上,逻辑运算符的两侧可以是任何类型的数据,比如说 字符型数据、实型数据、甚至是指针。
'c' && 'd' // 字符是ASCII码比较 ,这也是 真
逻辑表达式求解中,不是所有的逻辑运算符都会被执行,只有在必须执行下一个逻辑运算符才能求出表达式的结果时,才执行该运算符。
2.3 if 语句详解
2.3.1 if 语句的三种形式
if 语句(选择结构的代表性语句),用来判断给定的条件是否满足,根据判断的结果(真,假)决定执行给出的两种操作之一。
要在条件满足时同时执行多条语句,必须用 {} 把这些语句括起来构成复合语句。
if 语句可以单独使用,不需要 else,但是else语句不能单独使用,必须和if语句配对使用。
-
if (表达式) 语句;
-
if (表达式) {语句1} else {语句2;}
-
if (表达式) {语句1} else if {语句2;} ... ... else {语句n;}
示例:
int x = 4;
if (x > 1)
printf("x > 1");
printf("这时第二条语句"); // 由于只会执行到第一个的 ; 结尾,所以该行是不能被执行的,
// 执行第二行命令需要有 { }
else if (x > 2)
printf("x > 2");
int x = 4;
if (x > 1)
{
printf("x > 1\n");
printf("这时第二条语句\n");
}
else if (x > 2)
printf("x > 2");
int num = 400:
int cost = 0;
if (num > 500)
cost = 1;
else if(num > 300)
cost = 2;
else if(num > 100)
cost = 3;
else
cost = 4;
说明 if 后的小括号一般是 关系表达式 和 逻辑表达式。
if (x > 1 && x < 5)
==
和 =
要分开。
表达式的扩展,如果表达式值为0;那么按 "假" 处理,如果表达式的值为非0,则按 "真" 处理。
if (15)
{
printf("15\n");
}
=>
15
表达式的类型不限于关系表达式和逻辑表达式,也可以是任意数值类型可以是实型、字符型。
if ('a')
2.3.2 if 语句的嵌套
if 里面又包含 if,或者多个if语句。
注意else的配对,else总是和上面的尚未配对的if语句配对。
if ()
if () 语句1;
else 语句2;
else
if () 语句1;
else 语句2;
最好还是加上 { }
,明确else和那个if配对。
2.4 条件运算符和switch语句
2.4.1 条件运算符
条件运算符是 ? 和 : 组成的,判断第一部分是否为真,那么条件表达式就取第一个的值,否则就是后面的值。
条件运算符也称三目运算符,是C 语言中位唯一的一个三目运算符。
条件运算符从右到左。
实际使用频率不高,这是一个偶尔的写法,这只能进行简单的场合。
表达式1 ? 表达式2: 表达式3;
int a = 4, b = 5, max;
max = (a>b)?a:b; // max = a > b ? a:b; 条件运算符比关系运算符地
a > b ? a: c > d ? c : d // a > b ? a:(a>d?c:d)
2.4.2 switch 语句
switch 语句用于多分支选择结构,用的评率相对要高。
- 说明:
-
switch 后边表达式一般都是 整型变量 或者 表达式,其他类型也允许,但是都很罕见。
-
每个case后边的常量表达式必须互不相同,不然会出现编译错误
-
各个case语句之间,case与default顺序没有影响。
-
注意 不要忘记 break 否则后果严重,有些语言是不要求break,而 C 语言 需要。
-
忘记break的话,会导致执行一个case中包含的语句后,流程继续会执行下一个case条件中包含的语句(而不管该case条件是否满足),也就是说从满足条件的case语句那里作为入口一直执行下去,除非遇到break语句,或者整个switch执行完毕。
-
-
case后面可以有多行语句,可以不用加上
{ }
,会系统自动顺序执行本 case 后边的所有语句,一直到 break。 - default 语句可以没有,当所有的case都不满足的时候,则整个switch都不被执行。
- 多个case语句可以共用一组执行语句。
-
case 5:
case 6:
1行或者多行语句
switch (表达式)
{
case 常量表达式1:
{
1行或者多行语句
}
break;
case 常量表达式2:
{
1行或者多行语句
}
break;
case 常量表达式n:
{
1行或者多行语句
}
break;
... ...
default:
1行或者多行语句
break;
}
switch 后边的表达式的值若满足任何某个case的值,则执行该case后面的1行或者多行语句,一直遇到break停止,就跳出整个switch语句
当所有的case都不满足,则会执行default中包含的1行或者多行语句,然后跳出整个switch语句。
2.5 循环控制
2.5.1 概述、goto、while、do while 语句精解
循环控制语句:
- goto:
-
无条件转向语句,用来跳转到到某个程序位置进行执行。
-
goto 主要一般和 if 构成循环语句
-
不能跨函数
-
goto 语句标号;
语句标号是一个标识符,只能由字母、数字、下划线三种字符组成,并且第一个字符必须是字母或者下划线,并且标识符不可以是系统中的保留字。
goto lablel;
goto 语句有一定的争议,要看实际的情况的需要。
从循环体内到循环体外,不推荐,破坏了结构化程序设计原则,除非万不得已。
示列:
goto 语句 需要 loop:
int i = 0, sum = 0;
loop:
if (i<= 100)
{
sum = sum + i;
i++;
goto loop;
}
printf("%d\n",sum);
goto 语句的应用场合比较少,很多情况下会有其他的循环语句来取代 goto,同时注意不能跨函数。
2.6 while 语句
- 当型循环结构
- 先判断表达式的值,如果是真就执行语句,同时如果表达式为假,那么循环体内的语句一次也不执行
- 循环体中要有循环趋势于结束的语句
while (表达式) 要执行的语句
要执行的语句为多条时也就是复合语句的时候,用 { }
起来。
int i = 1, sum = 0;
while (i<=100)
{
sum = sum+i;
i++;
}
printf("%d\n",sum);
2.7 do while 语句
- 直到型循环结构
- 至少执行循环体内的语句一次,然后才判断是否满足,则继续执行循环体内的语句,一直到条件为假(条件不满足)
do 要执行的语句
while (表达式)
int i = 1, sum = 0;
do
{
sum = sum + i;
i++;
}
while (i<=100);
printf("%d\n",sum);
2.8 for语句精解
2.8.1 for 语句的一般形式
- 执行过程
- 先求解表达式1的值
- 表达式1只会执行一次
- 再求表达式2的值
- 若值为真(非0),则执行 for 语句中指定的内嵌语句,同时求解表达式3的值,反复运行步骤2,一直到表达式的2为假,这说明表达式1的值只执行一次。
- 若表达式2为假(非0),则循环结束,程序执行for语句后面的其他程序
- 先求解表达式1的值
2.8.2 for 语句实际操练
for (表达式1;表达式2;表达式3) 内嵌的语句
for (循环变量赋初值;循环变量来结束条件;循环变量增加值) 内嵌语句
如:
int i, sum = 0;
for (i = 1; i <= 100; i++)
{
sum = sum + i;
}
printf("%d\n",sum);
2.8.3 for 语句的主要说明
- 表达式1可以省略,但其后面的,不能省略,当表达式1省略时,应该在for之前就给循环变量赋予初值,这种写法比较罕见。
- 表达式2可以省略,也就是不判断循环条件,那么循环就会无终止执行下去了,这就必须要用 break 语句终止循环,这种写法也比较罕见。
- 表达式3可以省略,循环变量会消失,必须要想办法保证该for循环正常结束,否则循环会无终止进行下去。
- 可以省略表达式1,表达式3,只保留表达式2。
- 三个表达式都可以省略:不设置初值,不判断条件(认为条件一直是真),循环变量不增加。这种写法也少见。
-
导致一个无终止的执行循环体。
-
- 表达式1可以设置循环变量初值,有可以设置与循环变量武官的其他表达式。
- 表达式1和表达式3都可以是简单的表达式或者逗号表达式,不常用。
-
表达式1执行一次,表达式3执行多次,循环都少次表达式3执行多少次。
-
-
表达式2的值一般是关系表达式、或者是逻辑表达式,但是只要其值为非0,那就执行循环体
罕见写法:
int i, sum = 0;
for (i=1; ;i++)
{
sum = sum + i;
if (i >= 100)
break;
}
int i,sum;
for (sum = 0, i = 1; i <= 100; )
{
sum = sum + i;
i++; // 保证for循环正常结束的办法,这里放在内嵌语句中,没放在表达3 的位置
}
int i,sum;
sum = 0;
i = 1;
for (; i<=100; )
{
sum = sum +i;
i++;
}
for (;;) // 会被认为是真,一直执行内嵌的语句,
{
// 会被无限次执行,这种循环体要终止,根据一定的条件增加 break;
}
// 这就像是
while (1)
{
}
int i,sum;
sum = 0;
i = 1; // i 需要初始值,顶替后边 for 语句中的表达式1
for (;;)
{
sum = sum + 1;
if (i >= 100) // 顶替的就是 for 语句中的表达式2
break;
i++; // 顶替 for 语句中的表达式3的
}
int i, sum;
i = 1;
int j;
for (j = 4, sum = 0; i <= 100; i++)
{
sum = sum +i;
}
int i, j = 1000, sum;
for (sum = 0, i = 1; i<= 100; i++, j--)
{
sum = sum + 1;
}
printf("sum=%d\n",sum);
printf("j=%d\n",j);
int i, sum;
sum = 0;
for (i = 0; 8888; i++)
{
sum = sum + i;
if(i>100)
break;
}
printf("sum = %d \n",sum);