一、关系运算符:'<' ,'>',‘>=’,‘<=’, '==', '!='
在上述的6种关系运算符中,结合方向为自左向右,前四种关系运算符的优先级为7 ,后两种的关系运算符优先级为8 。关系运算符得出的结果只能是逻辑真或逻辑假,即为 0 or 1,在计算机中为了方便计算,非零即为真。在进行关系运算符时要注意分步骤进行,不能连续比较。
二、逻辑运算符
逻辑运算符包括:‘&&’,(与) ‘||’,(或) ‘!’(非),在逻辑关系中,与的优先级为11 ,或的优先级为 12,非的优先级为 2。
以 10<a<15为例
错误演示
int i = 20;
printf("%b\n", 10<i<15);
输出结果为1,说明不可这样表示,但是并不报错:先计算10<i,得到1,再进行1<15判断,结果正确,返回1
正确演示
int i = 12;
表示一
printf("%d\n", 10<i && i<15);
表示二
printf("%d\n", i==11||i==12||i==13||i==14);
表示三
printf("%d\n", !(i<=10)&&!(i>=15))
需要注意的是,在与的表达式中,当左表达式为假时,程序会在此截断,对右表达式不做处理,同理在或表达式中也是,当左为真时,也会截断 。
int i = -2;
int j = 3;
int k;
k = i < 0 && ++j || ++i;
printf("%d\n", i);
return 0;
在此代码中,就发生了左表达式为假的情况,所以输出i的值不变,或表达式的相同情况便不在此继续赘述。
三 、if 语句 学习
1. 语法结构
正确理解if语句的基本语法结构。if语句通常由关键字‘if’,条件表达式和语句块组成。条件表达式为真时,执行相应的语句块
if (条件表达式) {
// 如果条件为真,执行这里的代码
}
在写if(i == 0)时,为了方便可将其写为 if (!i)的形式。
2.表达式
if语句的条件表达式是一个结果为真或假的表达式。这通常涉及比较操作符(如`<`、`>`、`==`等)和逻辑操作符(如`&&`、`||`)
int x, y;
if (x > 0 && y < 10) {
// 如果x大于0并且y小于10,执行这里的代码
}
3.if语句代码块
如果if语句只有一条语句,花括号可以省略。然而,为了可读性和避免潜在的错误,建议总是使用花括号来明确if语句的代码块。
if (条件表达式)
单条语句; // 不推荐
if (条件表达式) {
// 多条语句; 推荐
}
4.嵌套
if语句可以嵌套,但要保持代码的可读性。使用适当的缩进和注释,以便清晰地表示逻辑结构。从心理学的角度来讲,一般进行嵌套时最好不要超过5层。
if (条件1)
{
if (条件2)
{
// 嵌套if语句的代码块
if(条件3)
{
//嵌套if语句的代码块
}
}
}
当然当上述代码块的条件1,2,3全部满足时,也可以将其写成 if(条件1 && 条件2 && 条件3 )的形式,但是要仔细检查条件表达式,确保它们符合你的逻辑要求。在条件复杂的情况下,可以使用拆分为多个条件来提高可读性。
5.三目运算符
三目运算符,它是唯一有 3 个操作数的运算符,其实三目运算符和 if / else 条件判断类似。三目运算符的表达形式:<表达式1> ? <表达式2> : <表达式3>,三目运算符的返回值:先求表达式 1 的值,如果为真,则执行表达式 2,并返回表达式 2 的结果;如果表达式 1 的值为假,则执行表达式 3,并返回表达式 3 的结果。
举个例子:
int a = 10, b = 20;
max = a > b ? a : b;
对于条件表达式 a > b ? a : b ,先判断条件a > b的真假,如果值为 true ,那么返回值max的值就为a,否则就为b。一个条件表达式绝不会既计算 a,又计算 b(就好比在 if / else 条件判断中,不可能既执行 if 后的代码又执行 else 之后的代码)。
注意:在 C 语言中,结果 1 和 结果 2 的类型必须一致。对于上面的代码,使用 if / else 条件判断同样也能实现:
//if/else条件判断
if(<表达式1>)
{
//<表达式2>
}
else
{
//<表达式3>
}
四、if else if 语句学习
1. 语法结构
if else if语句的基本语法结构。它由一系列if语句和一个可选的else语句组成,每个if语句都有一个条件表达式和相应的语句块。if语言可以独立出现,但是else语句不可以独立出现。
if (条件1) {
// 如果条件1为真,执行这里的代码
} else if (条件2) {
// 如果条件2为真,执行这里的代码
} else {
// 如果以上条件都不为真,执行这里的代码
}
...
int i = 0;
if(i > 0)
{
printf(">0\n");
}
else if(0 == i)
{
printf("==0\n");
}
else
{
printf("<0\n");
}
...
if(1 == month || 3 == month || 5 == month || 7 == month || 8 == month || 10 == month || 12 == month)
{
days = 31;
}
else if(4 == month || 6 == month || 9 == month || 11 == month)
{
days = 30;
}
else
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
days = 29;
}
else
{
days = 28;
}
}
printf("%d\n", days);
2.互斥性
注意每个条件的互斥性。如果条件之间有交叉,可能导致逻辑错误。确保每个条件只有在其前面的条件不满足时才会被考虑。
if (条件1) {
// 执行代码1
} else if (条件2) {
// 执行代码2
} else if (条件1 && 条件2) {
// 永远不会执行到这里,因为条件1已经为真
} else {
// 执行代码3
}
3.避免重复判定
在if-else if 语句中,条件的判定是从上到下的。如果某个条件为真,后续的条件将被忽略。因此,在条件之间有关联时,确保不会重复判定。
五、switch case语句的学习
1.语法结构
switch语句的基本语法结构,通常包含一个表达式(通常是整数或字符),以及一系列的case标签和相应的语句块。
switch (表达式) {
case 值1:
// 如果表达式等于值1,执行这里的代码
break;
case 值2:
// 如果表达式等于值2,执行这里的代码
break;
// 更多的case语句...
default:
// 如果表达式不等于任何case中的值,执行这里的代码
}
...
char c = 'F';
switch(c)
{
default:
printf("error!\n");
break;
case 'A':
printf("85~100\n");
break;
case 'B':
printf("70~84\n");
break;
case 'C':
printf("60~69\n");
break;
case 'D':
case 'E':
printf("less 60\n");
break;
}
...
2. case标签
case标签必须是整数常量表达式或字符常量表达式。每个case后面都要加上break语句,以确保在匹配到一个case后跳出switch语句,防止继续执行后续的case。
switch (x) {
case 1:
// 执行代码
break;
case 2:
// 执行代码
break;
default:
// 执行代码
}
3.default语句
default语句是可选的,用于处理表达式值与任何case都不匹配的情况。它通常放在switch语句的最后。而且要注意对default的拼写正确,在ubuntu 18.04的环境下,对default:拼写出错时,它会认为是下一行代码的代码名。
4.表达式类型
switch语句的表达式可以是整数或字符类型。其他类型(如浮点数)通常是不被支持的。
switch (ch) {
case 'A':
// 执行代码
break;
case 'B':
// 执行代码
break;
default:
// 执行代码
}
六.今日作业
1、从键盘输入一个字符,输出该字符的按字典排列顺序的下一个字符,例如,输入a,则输出b。如果输入的字符不在26个英语字母中,则显示输入数据有误,如果输入的字符是z或Z,则输出a或A;
2、从键盘输入一个字符,如果是小写字母转换为大写输出,如果是大写字母,转换为小写输出,如果是其他字符则按原样输出。