1. if 语句
- if 语句被称为分支语句(branching statement)或选择语句(selection statement)
if (expression)
statement
- 如果对 expession 求值为真(非0),则执行 statement;否则,跳过 statement
- statement 可以是一条简单语句或复合语句
- if 语句只能测试和执行一次
- expression 通常是关系表达式,即比较两个量的大小
- 即使 if 语句由复合语句构成,整个 if 语句仍被视为一条语句
2. if else 语句
if (expression)
stetement1
else
statement2
- 如果对 expession 求值为真(非0),则执行 statement1;否则,执行 statement2
- statement1 和 statement2 可以是一条简单语句或复合语句
2.1 另一个示例:介绍 getchar() 和 putchar()
- getchar() 函数不带任何参数,它从输入队列中返回下一个字符
- putchar() 函数打印它的参数
char c;
c = getchar();
scanf("%c", &c);
putchar(c);
printf("%c", c);
- 这些函数只处理字符,所以它们比更通用的 scanf() 和 printf() 函数更快、更简洁
- getchar() 和 putchar() 不需要转换说明,因为它们只处理字符
2.2 ctype.h 系列的字符函数
2.3 多重选择 else if
if (expression1)
stetement1
else if (expression2)
statement2
else
statement3
2.4 else 与 if 配对
- 如果没有花括号,else 与离它最近的 if 匹配,除非最近的 if 被花括号括起来
if (expression1)
stetement1
if (expression2)
statement2
else
statement3
2.5 多层嵌套的 if 语句
#include <stdio.h>
int main() {
int num = 0;
int vlaue = 1;
while (rewind(stdin), scanf("%d", &num) != EOF)
{
for (int i = 2; i < num / vlaue; i++)
{
if (num % i == 0)
{
vlaue = i;
printf("%d and %d\n", i, num / i);
}
}
}
}
3. 逻辑运算符
- 当且仅当 exp1 和 exp2 都为真时,exp1 && exp2 才为真
- 如果 exp1 或 exp2 为真,则 exp1 || exp2 为真
- 如果 exp1 为假,则 !exp1 为真;如果 exp1 为真,则 !exp1 为假
3.1 备选拼写:iso646.h 头文件
逻辑运算符 | iso646.h |
---|
&& | and | || | or | ! | not |
3.2 优先级
- ! 运算符的优先级很高,比乘法运算符高,与递增运算符的优先级相同,只比圆括号的优先级低
- && 运算符的优先级比 || 运算符高,但是两者的优先级都比关系运算符低,比赋值运算符高
3.3 求值顺序
- 除了两个运算符共享一个运算对象的情况外,C 通常不保证先对复杂表达式中的哪个部分求值
- 计算的顺序由编译器设计者决定
- 但是,C 保证逻辑表达式的求值顺序是从左往右
3.4 范围
if (i >= 90 && i <= 100)
if (90 <= i <= 100)
if (90 <= i <= 100)
if ((90 <= i) <= 100)
4. 条件运算符: ? :
- C 提供条件表达式(conditional expression)作为表达 if else 语句的一种便捷方式,该表达式使用 ? : 运算符
expression ? stetement1 : statement2
- 如果对 expession 求值为真(非0),则执行 statement1;否则,执行 statement2
if (i > 90)
printf("A\n");
else
printf("B\n");
(i > 90) ? printf("A\n") : printf("B\n");
5. 循环辅助:continue 和 break
- continue 和 break 语句可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环
5.1 continue 语句
- 执行到 continue 语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代
- 如果 continue 语句在嵌套循环中,则只会影响包含该语句的内层循环
#include <stdio.h>
int main() {
char c;
for (int i = 0; i < 10; i++)
{
c = getchar();
if (c == '\n')
{
continue;
}
putchar(c);
}
putchar('\n');
}
5.2 break 语句
#include <stdio.h>
int main() {
int i = 0;
int j = 0;
printf("i = ");
scanf("%d", &i);
while (i > 0)
{
printf("j = ");
scanf("%d", &j);
while (j > 0)
{
printf("i * j = %d\n", i * j);
if (j > 100)
{
break;
}
printf("j = ");
scanf("%d", &j);
}
if (i > 100)
{
break;
}
printf("i = ");
scanf("%d", &i);
}
}
6. 多重选择:switch 和 break
6.1 switch 语句
-
执行过程:
- 对紧跟在关键字 switch 后圆括号中的表达式求值
- 然后程序扫描标签列表,直到发现一个匹配的值为止
- 然后程序跳转至那一行
- 如果没有匹配的标签,有 defalut 则跳转至改行,没有 defalut 则继续执行在 switch 后面的语句
-
break 的作用:
- 让程序离开 switch 语句,跳至 switch 后面的语句
- 如果没有 break 语句,就会从匹配标签开始执行到 switch 末尾
char c = 'B';
switch(c)
{
case 'A': printf("1");
break;
case 'B': printf("2");
break;
case 'C': printf("3");
break;
default: printf("Other");
}
6.2 多重标签
char c = 'b';
switch(c)
{
case 'a':
case 'A': printf("1");
break;
case 'b':
case 'B': printf("2");
break;
case 'c':
case 'C': printf("3");
break;
default: printf("Other");
}
6.3 switch 和 if else
- 如果是根据浮点类型的变量或表达式来选择,则无法使用 switch
- 如果根据变量在某范围内决定程序流的去向,使用 switch 会很麻烦,使用 if else 会比较方便
- 使用 switch 需要涵盖全部范围,为每个整数设置 case 值
- 但是,如果使用 switch ,程序通常运行速度较快,生成代码较少
7. goto 语句
- goto 语句有两个部分: goto 和标签名
- 标签名遵循变量命名规则
goto part;
part: printf("part");
7.1 避免使用 goto
int i = 5;
if (i > 10)
goto a;
goto b;
a: printf('a');
b: printf('b');
int i = 5;
if (i > 10)
printf('a');
printf('b');
int i = 0;
a: scanf("%d", &i);
if (i < 0)
goto b;
printf("a");
goto a;
b: printf("b");
int i = 0;
while (i >= 0)
{
printf("a");
scanf("%d", &i);
}
printf("b");
- C 程序员可以接收的一种 goto 用法:出现问题时从一组嵌套循环中跳出
int i = 5;
while (i > 0)
{
for (int j = 1; j < 50; j++)
{
if (j = i)
{
goto exce;
}
}
}
exce: printf("Exception");
|