C语言自学《三》---- 条件判断

###算术比较 下面列出了两个操作数用于比较的算术比较运算符

它们的运算结果会得到int类型的值,如果为真则结果为1,如果为假结果为0 这些表达式称为逻辑表达式或者布尔表达式,因为每个表达式都会等到两个结果之一:truefalse

  • < 左操作数小于右操作数
  • <= 左操作数小于等于右操作数
  • == 左操作数等于右操作数
  • != 左操作数不等于右操作数
  • > 左操作数大于右操作数
  • >= 左操作数大于等于右操作数

###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表达式,直到找到一个结果为trueif表达式为止

代码示例:

<!-- 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变成falsefalse变成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语言中的运算符运算级别 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;

转载于:https://my.oschina.net/luoguankun/blog/208883

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值