一、if语句
通用形式
if(expression)
{
statement;
}
expression为真,执行statement,否则跳过statement
二、if-else
通用形式
if(expression)
{
statement1;
}
else
{
statement2;
}
双分支结构,若expression为真,执行statement1·,否则执行statement2。
三、else-if
通用形式
if(expression1)
{
statement1;
}
else if(expression2)
{
statement2;
}
else
{
statement3;
}
多分支结构,在第一个if和最后一个else之间,可以有多个else-if分支。
四、else与if匹配
在没有花括号约束的情况下,else与距离自己最近的if进行匹配
if(x > 10) //如果 x > 10,才会进行执行第一个输出
{
printf("I'm the first if\n");
if(x < 20) //如果 10 < x < 20,会执行第二个输出
{
printf(“I'm the second if\n”);
}
}
else //如果 x <= 10,才会输出done!这个else是与第1个if配对的
{
printf("done!\n");
}
以上代码,如果缺少花括号,流程就会有所改变
if(x > 10) //如果 x > 10,才会进行执行第一个输出
printf("I'm the first if\n");
if(x < 20) //只要 x < 20,就执行第二个输出
{
printf(“I'm the second if\n”);
}
else //如果 x >= 20,才会输出done!这个else是与第2个if配对的
{
printf("done!\n");
}
五、字符输入/输出函数:getchar()和putchar()
getchar()不带任何参数,从输入中接收并返回下一个字符,返回值类型为int
int ch;
ch = getchar(); //将getchar()接收到的字符赋值给变量ch。
//变量ch设置位整型,确保能够准确接收getchar()的赋值。因为getchar()可以接收输入中的任意字符。
//若将ch设置位char类型,就属于将int类型的返回值赋值给char类型变量,是降级操作,可能导致输入的字符被截断,从而无法得到正确的字符。
putchar()函数打印它的参数。
putchar(ch); //ch是上面代码段声明的变量
printf("%d", ch); //这两条语句等价
六、逻辑运算符
逻辑运算符 | 含义 |
&& | 与 |
|| | 或 |
! | 非 |
优先级:
(1)!运算符的优先级非常高,与递增运算符的优先级相同,只低于圆括号
(2)&&运算符的优先级高于||运算符,但两者的优先级都低于关系运算符,高于赋值运算符
(3)在一个表达式中使用多种运算符时,即便清楚优先级,最好也使用圆括号,方便阅读
求值顺序
除了两个运算符共享一个运算对象的情况外,C通常不保证先对复杂表达式中的哪一项进行求值。
但是,对于逻辑运算符是一个例外!
C保证,逻辑表达式的求值顺序是从左往右。&&和||都是序列点,所以程序在从一个运算对象执行到下一个运算对象之前,所有的副作用都会生效。
C保证,一旦发现某个元素使整个表达式无效,立即停止求值
while((ch = getchar()) != ' ' && ch != '\n') //逻辑表达式的求值顺序确保ch先被赋值
七、条件运算符
C提供条件表达式作为if-else的一种便捷方式,该表达式使用条件运算符,通用形式:
//如果expression为真,那么整个条件表达式的值与expression1的值相同,否则与expression2的值相同
expression ? sexpression1 : expression2;
八、循环辅助:continue和break
continue
continue和bireak语句可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环
3种循环都可以使用continue语句。执行到该语句时,会跳过本次迭代的剩余部分,开始执行下一次迭代。
如果continue语句在嵌套循环内,只会影响包含该语句的内层循环
continue还可以作为占位符
while(getchar() != '\n')
{
continue; //如果输入的不是回车,则丢弃输入
}
//因为这个循环的循环体是一条空语句,什么都不用执行
//所以这里的continue只是作提醒作用,比起空语句,更能让人注意到这个循环的循环体,提高了程序的可读性
对于while和do-while循环,执行continue语句后的下一个动作是对循环的测试表达式求值
对于for循环,执行continue的下一个动作是对更新表达式求值,然后再对测试表达式求值
break
程序执行到bireak语句时,会终止包含它的循环,并继续执行循环后面的语句。
对于for循环,break和continue的情况不同,执行完break语句后,会直接执行循环后面的语句,不会对更新表达式求值
与continue一样,在嵌套循环中的break只会影响包含它的当前循环
九、switch和break
多重选择:switch-case,通用形式
switch(整型表达式)
{
case 常量1: //可以有多个case标签供选择
statement1; //可以使用break语句跳出switch
case 常量2:
statement2;
default: //default语句是可选的,但一般都会有
sataement;
}
switch在圆括号中的测试表达式应该是一个整数值(包括char类型)。
case标签必须是整数类型(包括char类型)的常量或整型常量表达式。
带多重标签的switch语句:程序根据expression的值跳转至case标签处。然后,执行剩下的所有语句,非常执行到break语句进行重定向