###算术比较 下面列出了两个操作数用于比较的算术比较运算符
它们的运算结果会得到int类型的值,如果为真则结果为1,如果为假结果为0 这些表达式称为逻辑表达式或者布尔表达式,因为每个表达式都会等到两个结果之一:
true
或false
<
左操作数小于右操作数<=
左操作数小于等于右操作数==
左操作数等于右操作数!=
左操作数不等于右操作数>
左操作数大于右操作数>=
左操作数大于等于右操作数
###if语句
在了解了逻辑表达式之后,就可以配合if语句来对程序进行流程的控制
代码示例:
<!-- lang: cpp -->
#include <stdio.h>
int main(){
int a = 10;
int b = 11;
if(a<b) {
printf("a<b");
} else if(a>b) {
printf("a>b");
} else {
printf("a=b");
}
//由于if语句控制表达式要生成一个布尔结果,所以编译器要将if表达式的数值结果转换为bool类型
//根据上面的结论,可以想象,下面的例子(当count值为0时是false,只有在非0时才执行if代码块内的语句)
int count = 0; //由于是0所以下面的if判断没有进去
if(count){ //只有当非0时才是true,因为0是false,1是true
printf("The value of count is not zero. \n");
}
}
####嵌套的if语句
嵌套if语句就是if语句中再包含if语句,更精确的控制,只有当最外层的if为true时,才能进入到里层的if判断
代码示例:
<!-- lang: cpp -->
#include <stdio.h>
#includ <limits.h>
int main(){
long test = 0L;
printf("Enter an integer less than %ld\n",LONG_MAX);
scanf(" %ld",&test);
if(test % 2L == 0L) {
printf("The number %ld is even",test);
if((test / 2L) % 2L == 0L) {
printf("\nHalf of %ld is also even",test);
printf("\nThat's interesting isn's it?\n");
}
} else {
printf("The number %ld is odd\n",test);
}
}
####多项选择语句else if 语句
一组选项中选择一项的语句 每个
if
表达式均可任意,只要其结果是true
或者false
即可 如果第一个if
表达式为false,就执行下一个if
表达式,直到找到一个结果为true
的if
表达式为止
代码示例:
<!-- lang: cpp -->
//注意,在第一个if语句后,不需要测试if条件中的下限,因为如果执行到某个if,前面的测试就一定是false
if(salary < 5000) {
printf("Your pay is very poor."); //pay < 5000
} else if(salary < 15000) {
printf("Your pay is not good."); //pay < 15000
} else if(salary < 50000) {
printf("Your pay is not bad."); //pay < 50000
} else if(salary < 100000) {
printf("Your pay is very good."); //pay < 100000
} else {
printf("Your pay is exceptional."); //pay >= 100000
}
####多项选择语句switch 语句
switch
语句允许根据一个整数表达式的结果,从一组动作中选择一个动作switch
语句没有else if
语句那么灵活,但在许多情况下使用起来很简单
代码示例:
<!-- lang: cpp -->
switch(ticket_number)
{
case 35:
printf("Congratulations! You win first prize!");
break;
case 122:
printf("You are in luck - second prize.");
break;
case 78:
printf("you are in luck - third prize.");
break;
default:
printf("Too bad, you lose.");
}
使用枚举类型的变量控制switch
<!-- lang: cpp -->
enum Weekday {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}today = Wednesday;
switch(today){
case Sunday:
printf("Today is Sunday");
break;
case Monday:
printf("Today is Monday");
break;
case Tuesday:
printf("Today is Tuesday");
break;
case Wednesday:
printf("Today is Wednesday");
break;
case Thursday:
printf("Today is Thursday");
break;
case Friday:
printf("Today is Friday");
break;
case Saturday:
printf("Today is Saturday");
break;
case Sunday:
printf("Today is Sunday");
break;
default:
printf("today is a Invalid value!");
}
再看一个例子:
<!-- lang: cpp -->
int main()
{
char ch = 0;
printf("please input a char type letter:\n");
scanf("%c",&ch);
//isalpha()函数用来判断char字符是不是一个字母,如果是就返回true,否则返回false
//所以if语句中的!isalpha()函数的意思是
//如果传入的不是一个字母就为true,就执行if语句块中的语句,否则就执行else语句中的代码
if(!isalpha(ch)){
printf("The character is not a letter.\n");
} else {
switch(tolower(ch)){
case 'a': case 'e': case 'i': case 'o': case 'u':
printf("The character is a vowel.\n");
break;
default:
printf("The character is a consonant.\n");
}
}
return 0;
}
###测试字符
下面是一些字符类型的比较
'Z' >= 'A'
结果为true,因为Z=90,A=65'Q' >= 'P'
结果为false,因为P在Q的前面'B' <= 'b'
结果为true,因为小写字母比对应的大写字母大32'B' != 66
结果为false,B的十进制值为66
代码示例:将大写字母转换为小写字母
<!-- lang: cpp -->
#include <stdio.h>
/*
下面的判断还可以写的更加严谨,但是这里只是简单看一个例子
字符的大小写转换也可以使用标准库头文件<ctype.h>中的toupper()和tolower()函数
*/
int main(void) {
char letter = 0;
printf("Enter an uppercase letter:");
scanf("%c", &letter);
if(letter >= 'A') {
if(letter <= 'Z') {
//下面是把大写字母转换为小写字母的方法,适用于所有大写字母,但是只能用于ASCII编码
letter-= 'A' + 'a';
printf("You entered an uppercase %c\n", letter);
} else {
printf("Try using the shift key! I want a capital letter.\n",);
}
} else {
printf("You didn't enter a letter\n");
}
return 0;
}
###逻辑运算符
有时候执行一个测试不足以做出判断,而需要合并两个或多个检查,如果这些条件都是
true
,才执行某个操作
####逻辑与运算符&&
它合并两个逻辑表达式,即两个表达式的值都为true或false的表达式 例如:test1 && test2
这个逻辑表达式,当test1和test2都为true
才为true
,有一个false
此表达式就为false
代码示例:
<!-- lang: cpp -->
//当a的值大于5并且小于20的时候,也就是6~19之间,打印"5<a<20"
int a =10;
if(a > 5 && a < 20) {
printf("5<a<20");
}
//与上面其实是一个道理,只不过把逻辑表达式存储到了布尔变量中,同样if表达式中两个都为true时,才执行输出语句
bool test1 = a > 5;
bool test2 = a < 20;
if(test1 && test2) {
printf("5<a<20");
}
####逻辑或运算||
逻辑或运算符
||
用于两个或多个条件为true
的情形 如果运算符||
的一个或两个操作数是true
,结果就是true
只有全部操作数都是false
,结果才是false
||
或运算符的单个例子就不在这举例子了,举一个&&
和||
共存的例子吧
代码示例:
<!-- lang: cpp -->
//下面2大块表达式中的第一个表达式是并且的关系,所以都要都为true,结果才是true
//不过由于2大块表达式的关系是或者,2大块表达式中的一个为true就可以执行输出语句
if((age >12 && age < 20) || savings > 5000) {
printf("Either you're a teenager, or you're rich, or possibly both.");
}
####逻辑非!运算符
!
运算符是一元运算符
,因为它只有一个操作数 它起到翻转逻辑表达式的值,使true
变成false
,false
变成true
尽量避免使用这个运算符,它使代码难以理解 下面只给出一个示例,不过多说明了
代码示例:
<!-- lang: cpp -->
if((!(age <= 12) && !(age >= 20)) || !(savings <= 5000)) {
printf("Something do it...");
}
####条件运算符
条件运算符根据一个逻辑表式等于
true
还是false
,执行两个表达式中的一个 由于涉及三个操作数:一个逻辑表达式和另外两个表达式,因此也称为三元运算符,或三目运算符 condition ? expression1 : expression2 如果condition为true,则执行expression1,否则执行expression2
代码示例:
<!-- lang: cpp -->
x = y > 7 ? 25 : 50;
//相当于下面if判断语句
if(y > 7) x = 25;
else x = 50;
较为复杂的三元运算代码示例:
<!-- lang: cpp -->
int main()
{
const double unit_price = 3.50; //单价
const double discount1 = 0.05; //折扣1
const double discount2 = 0.1; //折扣2
const double discount3 = 0.15; //折扣3
double total_price = 0.0; //总价
int quantity = 0; //数量
//提示用户输入一个购买数量,此处我输入了60
printf("Enter the number that you want to buy:");
scanf(" %d",&quantity);
//下面的运算,根据用户输入的购买数量后经过打折后计算的总价
//首先,由于上面我输入了60,也就是quantity=60
//所以符合>50的表达式,通过阅读条件,现在表达式变成了下面的样子
//total_price = quantity * unit_price *
// (1.0 - (quantity > 50 ? discount3 : something-else));
//quantity > 50表达式成立,所以又变成了下面这样
//total_price = quantity * unit_price * (1.0 - discount3);
//total_price = 60 * 3.50 * (1.0 - 0.15);
//total_price = 60 * 3.50 * 0.85; 60(int类型)隐式转换为double类型再进行乘法计算
//total_price = 178.50 这就是整个的运算顺序
total_price = quantity * unit_price * (1.0 - (quantity > 50 ? discount3 :
(quantity > 20 ? discount2 :
(quantity > 10 ? discount1 : 0.0))));
//输出总价
printf("The price for %d is $%.2lf\n",quantity,total_price);
return 0;
}
###运算符的优先级
运算符的优先级确定了表达式中运算符的执行顺序,如下所示:
代码示例:
<!-- lang: cpp -->
//下面的表达式的含义为,求职者必须年龄大于等于25并且是哈佛大学毕业,或者是耶鲁大学毕业
Age >= 25 && Harvard || Yale;
//上面的语句相当于下面的语句,如果不知道运算符的优先级,加上括号也是无害的,因为()的运算符级别是最高的
(Age >= 25 && Harvard) || Yale; //&&的运算级别高于||,所以加上括号也是一样的
//如果要是要求耶鲁大学毕业并且年龄也要大于等于25,就要改成下面这样,用括号括起来,改变运算的执行顺序
//自然语意也就发生了改变
Age >= 25 && (Harvard || Yale);
下面的图片表示了C语言中的运算符运算级别
结合上图可以简单总结一下基本的顺序: 二元算术运算符 > 比较运算符 > 二元逻辑运算符 因此,先执行算术运算,再进行比较,之后执行逻辑操作 赋值符号
=
是列表中最后一个,所以它们在其他运算都完成后执行 注意!
运算符在逻辑运算符中的优先级别最高,因此,翻转逻辑表达式的值时,逻辑表达式外面的括号是必需的
###按位运算符
按位运算符有6个,他们操作的是整数值中的位 这些位运算符都只能用于整数类型,其中除了
~
运算符是一元运算符,只处理一个操作数,其余都是二元运算符 它们如下所示:
&
按位与运算符|
按位或运算符^
按位异或(EOR)运算符~
按位非运算符,也称为1的补位运算符<<
按位左移运算符>>
按位右移运算符
####按位与运算符&
如果两个数的二进制某位都是1,结果位就是1,否则,结果位就是0
<!-- lang: cpp -->
//计算过程如下
//x 0 0 0 0 1 1 0 1
//y 0 0 0 0 0 1 1 0
//x&y 0 0 0 0 0 1 0 0 所以z等于4
int x = 13;
int y = 6;
int z = x & y; //z = 4
####按位或运算符|
如果对应位中有一个或两个位是1,按位或运算符|
就生成1,否则就生成0
<!-- lang: cpp -->
//x 0 0 0 0 1 1 0 1
//y 0 0 0 0 0 1 1 0
//x|y 0 0 0 0 1 1 1 1 所以z等于15
int z = x | y; //z = 15
####按位异或运算符^
如果两个位是不同的,按位异或运算符^
就生成1,否则就生成0
<!-- lang: cpp -->
//x 0 0 0 0 1 1 0 1
//y 0 0 0 0 0 1 1 0
//x|y 0 0 0 0 1 0 1 1 所以z等于11
int z = x ^ y; //z = 11
####按按位非运算符^
也称为1的补位运算符
,它会翻转其操作数的为,将1变为0,0变为1
<!-- lang: cpp -->
//x 0 0 0 0 1 1 0 1
//~x 1 1 1 1 0 0 1 0
int x = 13;
int z = ~x; //z = -14
####按位左移运算符<<
按位左移运算符<<
会把左操作数位移动右操作数指定的位数
<!-- lang: cpp -->
//value 0 0 0 0 1 1 0 0
//value<<shiftcount 0 1 1 0 0 0 0 0 向左移了3位,所以等于96
int value = 12;
int shiftcount = 3;
int result = value << shiftcount; //result = 96
####按位右移运算符>>
相对于左移,它较为复杂,对于不带符号的数值,向右移位时,会在左边的空位中填充0
<!-- lang: cpp -->
//在2字节中value的二进制值为:1111 1111 0101 1100
unsigned int value = 65372U;
//value中的位向右移动两位,在左边补入0,得到的值存储在result中
//在二进制中,其值为0,在十进制中,其值为16343
//0011 1111 1101 0111
unsigned int result = value >> 2;