运算符、分支语句
位操作符:
可以直接操作二进制数位的内容;~是一个单目位操作符,它可以根据一个数字计算另外一个数字,这两个数字所有二进制数位的内容都不同(按位取反),使用的时候这个符号应该写在数字前面
双目位操作符:包括按位与(&),按位或(|)以及按位异或(^),他们都可以把两个数字对应二进制数位的内容做计算。
按位与(&)
可以把两个数字对应数位的内容做计算;只要一个数位的内容是0则与计算以后的结果就是0
3 0000 0011
& 5 0000 0101
0000 0001
任何数位内容和0做按位与结果一定是0,任何数位内容和1做按位与结果保持不变,按位与可以用来获得某些数位的内容,按位与还可以把某些数位的内容设置成0.
按位或(|)
可以把两个数字对应数位的内容做或计算;只要一个数为的内容是1则或计算以后结果就是1
3 0000 0011
| 5 0000 0101
0000 0111
任何数位内容和0做按位或结果保持不变;任何数位内容和1做按位或结果就是1,按位或可以把某些数位的内容设置成1
按位异或(^)
可以把两个数字的对应数位内容做异或计算,如果两个数位内容一样则异或结果是0,否则结果是1
3 0000 0011
^ 5 0000 0101
0000 0110
任何数位内容和0做按位异或保持不变;任何数位内容和1做按位异或一定改变,按位异或可以把某些数位的内容变成相反内容
'a' 97 0110 0001
'A' 65 0100 0001
ch &=32;
ch |=32;
ch ^=32;
移位操作符
可以把一个数字里所有二进制数位的内容统一向左或向右移动n个位置
'>>'表示向右移位
'<<'表示向左移位;
他们都是双目位操作符,操作符左边是将要进行移位操作的数字,操作符右边是将要移动的数位,移位操作本质上就是把每个数位的内容放到另外一个数位里,向左移位的时候右边空出来的数位里必须填充0,无符号类型数字右移的时候左边空出来的数位里填充0;有符号类型数字右移的时候左边空出来的数位里填充符号位的内容(1或0)。一般情况下向左移动n个位置相当于乘以2的n次方,向右移动n个位置相当于除以2的n次方。所有位操作符都不会修改存储区内容。
&也可以作为单目操作符使用,这个时候它可以用来计算一个存储区的地址;使用的时候应该把这个操作符写在一个存储区的前面,可以使用%p占位符把地址数据显示在终端窗口里。我们的计算机里所有地址数据都是由32个二进制数位构成的。
*也可以作为单目操作符使用,这个时候它可以根据一个地址找到对应的存储区,这个操作符应该写在一个地址数据前面。
三目操作符
可以从两套计算规则里选择一套进行计算,三目操作符格式如下:
布尔值 ? 公式1:公式2;如果布尔值为真就采用公式1计算,否则就采用公式2计算。不要再?后使用赋值操作符
练习:男人身高减体重小于105算超重,女人身高减体重小于110算超重;gender(0代表女人,1代表男人),height 身高,weight 体重。使用三目表达式。
gender ? height-weight<105:height-weight<110
练习:编写程序从键盘得到一个0到127之间的整数,把这个整数转换成二进制的结果显示在屏幕上
隐式类型转换
如果表达式里包含多个不同类型的数字就必须首先把他们转换成同一个类型然后在计算,这个转换过程叫隐式类型转换,隐式类型转换完全由计算机完成,隐式类型转换的时候必须把占地小的类型转换成占地大的类型,如果不同类型数字大小不一样就把整数类型转换成单精度浮点类型,把有符号类型转换成无符号类型。
强制类型转换
C语言程序里可以临时给数字指定类型,这叫做强制类型转换,强制类型转换格式如下
(char)300
强制类型转换有可能导致数据内容丢失,类型转换不会修改存储区内容
分支语句
分支语句可以从几组语句中选择一组执行而忽略其他组,如果在编写程序的时候遇到多种可能性,每种可能性需要专门的语句处理就需要使用分支;if关键字可以用来编写分支语句,if分支里需要为每种可能性编写专门的语句进行处理,if分支里需要为每组语句编写配对的逻辑表达式,当某个逻辑表达式结果为真的时候就执行它配对的那一组语句。
if(){
}
else if(){
}
else if(){
}
else if(){
}
if分支里的任何两组语句都不可能同时执行(可能同时执行的语句不可以被包含在一个if分支里),编写if分支的时候最好先把所有可能性的个数确定下来,如果分支里必然有一组语句会执行就可以省略最后一组语句的逻辑表达式和if关键字如果if分支里多个逻辑表达式同时为真就执行第一个为真的逻辑表达式所对应的语句而忽略后面的语句,可以利用这一点简化if分支里的逻辑表达式。if分支里的某一组语句不仅仅和他配对的逻辑表达式有关,只有当前面的所有的逻辑表达式都为假而配对逻辑表达式为真的时候才会执行这组语句。编写if分支的时候尽量把逻辑表达式简单的写在前面。
练习:编写程序从键盘得到三个数字,找到其中最小的数字并把它显示到屏幕上
switch……case格式也可以用来编写分支,如果一个分支里每个可能性都可以用一个唯一的整数表示,这种分支才可以用switch……case格式实现,
switch () {
case 0:
break;
case 1:
break;
case 2:
break;
case 4:
break;
default:
}
练习答案:
点击查看代码
#if 0
/*
*
* 操作符演示
*
* */
#include<stdio.h>
int main(){
char ch=~0x92;
int num=ch;
printf("num=0x%x\n",num);
printf("3&5=%d\n",3&5);
printf("3|5=%d\n",3|5);
printf("3^5=%d\n",3^5);
printf("3<<2=%d\n",3<<2);
num=0x80000000;
printf("0x80000000>>2=0x%x\n",0x80000000 >> 2);
printf("num=0x%x\n",num >> 2);
return 0;
}
#elif 0
/*
*
* 地址相关操作符演示
*
*
* */
#include<stdio.h>
int main(){
int num=0;
printf("&num=%p\n",&num);
*(&num)=10;
printf("num=%d\n",num);
return 0;
}
#elif 0
/*
*
* 三目表达式演示、
*
*/
#include<stdio.h>
int main(){
int num=0;
printf("请输入一个数字:\n");
scanf("%d",&num);
num=num >= 0 ? num : 0-num;
printf("绝对值是%d\n",num);
return 0;
}
#elif 0
/*
* 显示从0到127之间的 整数,显示二进制
*
* */
#include<stdio.h>
int main(){
int num=0;
unsigned char tmp=0x80;
printf("请输入数字0-127:\n");
scanf("%d",&num);
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf(" %d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
tmp >>= 1;
printf("%d", (num & tmp) != 0);
printf("\n");
return 0;
}
#elif 0
/*
*
* 类型转换演示
*
* */
#include<stdio.h>
int main(){
printf("num=%d\n",sizeof(1 ? 1: 0.9));
printf("num1=%d\n",-7+3<0);
printf("num2=%d\n",-7+3u<0);
printf("%d %d\n",300,(char)300);
return 0;
}
#elif 0
/*
*
*if 分支语句演示
*
* */
#include<stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:\n");
scanf("%d",&num);
if(num > 0){
printf("非负数\n");
}
else if(num<0){
printf("负数\n");
}
else if(!num){
printf("是0\n");
}
return 0;
}
#elif 0
/*
*
* if分支演示
*
* */
#include<stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:\n");
scanf("%d",&num);
if (num < 0) {
printf("负数\n");
}
else if (num >= 0 && (num & 1)) {
printf("奇数\n");
}
else if (num >= 0 && !(num & 1)) {
printf("偶数\n");
}
return 0;
}
#elif 1
/*
*
* 寻找最小数字
*
* */
#include<stdio.h>
int main(){
int num1=0,num2=0,num3=0;
printf("请输入三个数字:\n");
scanf("%d%d%d",&num1,&num2,&num3);
/*if (num2 > num1 && num3 > num1 ) {
printf("最小数字是:%d\n",num1);
}
else if (num1 > num2 && num3 >num2) {
printf("最小数字是:%d\n",num2);
}
else if (num1 > num3 && num2 > num3) {
printf("最小数字是:%d\n",num3);
}*/
if (num1 > num2) {
if (num2 > num3) {
printf("最小数字是是%d\n",num3);
}
else {
printf("最小数字是%d\n",num2);
}
}
else{
if (num1>num3) {
printf("最小数字是%d\n",num3);
}
else {
printf("最小数字是%d\n",num1);
}
}
return 0;
}
#endif