×

C语言基础第二节

96
小全同学
2015.10.02 18:22* 字数 2334

以前我没得选,现在我可以选择了,我选择做个好人。——《无间道》

布尔类型

布尔类型本质就是表示“是”或“不是”的变量。需要注意的是,在C语言中,C89版本中没有布尔值,在C99版本中才出现了表示“是”或“否”的布尔值:bool,也就是俗称的“小布尔”。在C99中,使用true表示“真”,使用false表示假,整型数0表示假,非零表示真。

在OC中的布尔值是BOOL,也就是俗称的“大布尔”,使用YES表示真,使用NO表示假,用整型数0表示假,整型数1表示真。

如何定义一个布尔变量呢?和定义一个正向变量一样,使用类型修饰符+变量名+赋值就可以定义出一个布尔变量了

bool a = true;
BOOL b = YES;

如上代码,我们分别定义出了一个C中的布尔变量和一个OC中的布尔变量,如果要打印他们的值可怎么办?打印布尔变量的值和打印整型变量的值方式一样,使用%d作为占位符,打印出0就表示“假”,打印出1就表示“真”。

布尔值常常使用在分支语句中,根据不同的情况选择执行不同的分支代码。

关系运算符

负责比较两个表达式、变量、常量的大小的运算符就是关系运算符,常用的有大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)、不等于(!=)

关系运算符的运算结果是布尔值,需要用布尔类型的变量来保存结果。如:

BOOL result = 12 > 23;

布尔变量result保存的结果就是关系表达式12 > 13的结果,很名显,这个表达式的结果为假,打印result的值为0。

刚刚提到了“关系表达式”这个概念,什么是关系表达式?由常量、变量、关系运算符组合而成的表达式,就是关系表达式。在关系运算符的两边不仅可以放变量、常量,还可以放表达式,但是在这种情况下,注意运算符的优先级,先算哪个表达式,再算哪个表达式一定要搞清楚,否则程序很容易出错。

有几个注意点:

  1. 判断是否相等的表达式为==
    这一点和生活中有所不同,在生活中或数学领域,使用“=”表示判断相等,在程序中使用一个短等号表示“赋值”的意思,将赋值号右边的内容赋给左边;使用两个短等号表示判断是否相等的意思,判断等于表达式左右两边是否相等,相等返回真,不等返回假。

  2. 在程序中表示x大于a且小于b不能使用“a < x < b”,分开来写,两个关系表达式之间使用“&&”连接。“&&”是个什么鬼?后边的逻辑运算符会讲到。

逻辑运算符

逻辑运算符是用来判断两个表达式之间的逻辑关系的,有与(&&)、或(||)、非(!)三种。

逻辑表达式由常量、变量、逻辑运算符组成。逻辑表达式的运算结果和关系表达式的运算结果一样,都是只有两种状态:真或假。使用布尔类型的变量保存。

逻辑与:&&

逻辑与运算的运算规则:一假即假。在逻辑与两侧的常量、变量、表达式,只要有一个为假,整个逻辑表达式返回值为假。只有两边均为真,返回的值才为真。

逻辑与的短路现象:逻辑与运算中,只要找到符合“假”的条件,马上返回“假”,不再继续向后计算。

    int a = 10;
    int b = 20;
    
    BOOL r1 = (a < b) && (b == 3);
    printf("%d\n", r1);
    
    BOOL r2 = (a == 3) && (b > a);
    printf("%d\n", r2);

    BOOL r3 = (a > 3) && (b > a);
    printf("%d\n", r3);

    
    // 短路现象
    
    BOOL r4 = (a > 5) && a++;
    printf("r4 = %d, a = %d\n", r4, a);
    
    // 表达式1结果为假,整个逻辑表达式结果已经为假,表达式2不在进行运算
    BOOL r5 = (b < 5) && b++;
    printf("r5 = %d, b = %d\n", r5, b);

逻辑或 ||

逻辑或的运算规则:一真即真。在逻辑或运算符两侧的常量、变量、表达式,只要有一个为真,则整个逻辑表达式为真。

逻辑或的短路现象:逻辑或运算中,只要找到符合“真”的条件,马上返回“真”,不管后边是否还有表达式,均不再计算。

 int a = 10;
    int b = 20;

    BOOL r1 = (a < b) || (b == 3);
    printf("%d\n", r1);
    
    BOOL r2 = (a == 3) || (b > a);
    printf("%d\n", r2);
    
    BOOL r3 = (a > 3) || (b > a);
    printf("%d\n", r3);

    
    
    // 短路现象
    
    BOOL r4 = (a < 5) || a++;
    printf("r4 = %d, a = %d\n", r4, a);
    
    // 表达式1结果为真,整个逻辑表达式结果已经为真,表达式2不在进行运算
    BOOL r5 = (b > 5) || b++;
    printf("r5 = %d, b = %d\n", r5, b);

逻辑非 !

逻辑非,即取反运算。原来为真,进行逻辑非运算后变为假;原来为假,进行逻辑非运算后变成真。对真假进行取反操作。

    BOOL a = YES;
    BOOL b = !a;
    
    printf("a = %d\n", a);
    printf("b = %d\n", b);

运算符的优先级

掌握运算符的优先级可以准确的写出自己需要的语句。
运算符的优先级: ! > 算数运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符

分支控制语句

设计程序的结构有三种形式:顺序结构、分支结构、循环结构。顺序结构的程序执行就是从第一行代码开始依次向后执行到最后一行结束。分支结构是判断不同的情况,来执行不同分支的代码,也就是我们接下来要学习的一种结构。循环结构是在某种特定条件下,重复的执行某段代码若干次。

if语句

if语句是C语言中提供分支结构的一种语法,有三种写法。分别可以实现单个分支,双分支,多分支结构。

单分支结构

    if (条件表达式) {
        
        语句
    }

if 如果
条件表达式:里边可以写算术表达式、逻辑表达式...... 表达式的结果为真或假。 如果条件表达式为真,执行{}内的语句;如果条件表达式为假,跳过{},执行下面的语句
编码规范 注意空格和换行

示例代码:

    int a = 4, b = 5;
    
    if (a < b) {
        
        printf("条件表达式结果为真\n");
    }
    
    printf("我在if语句下面\n");

双分支结构

    if ( 条件表达式 ) {
        
        语句1
        
    } else {
        
        语句2
    }

双分支结构一般用于“某条件成立则执行分之一,否则执行分支二”的情况。

多分支结构

    if ( 条件表达式1 ) {

        语句1

    } else if ( 条件表达式2 ) {

        语句2
    } else {

        语句3
    }

像这种多分支结构,需要判断多个不同的情况来决定执行哪一个分支。

条件运算符

条件运算符是if语句中双分支结构的一种变形,可以用来处理一些简单的分支判断。语法如下

条件表达式 ? 表达式1 : 表达式2

运算规则:如果条件表达式为真,整个表达式的值为表达式1的值;如果条件表达式为假,整个表达式的值为表达式2的值。
示例代码:

    int a = 3, b = 4;
    int c = a > b ? a : b;

示例中的条件表达式为假,所以整个表达式返回的值是表达式二的值,也就是b的值,打印整形变量c的值,就是4。

拓展:如果表达式一的位置什么都不写,如a>b ? : 23,当a>b为真,那么整个表达式返回的值是'a>b'的值,如果a>b为假,则整个表达式返回的值是表达式二的值,也就是23。这是一种简略的写法,在OC中经常使用。

switch语句

在多分支结构中,除了if语句,还有一种更合适的语法:switch语句。使用switch...case...结构代替if的级联结构,大大的提高了代码的可读性,简化了代码量。
switch的语法

switch (整型或字符型表达式) {
        case 整型或字符型常量:
            语句一;
            break;
        case 整型或字符型常量:
            语句二;
            break;
        
        default:
        默认情况下执行的语句;
            break;
    }

多分支语句
作用:提供多个分支,功能类似if-else级联式,代码可读性更好
语法:
(1)switch后面是 整型或字符型表达式
(2)case后面是 整型或字符型常量
(3)case后面需要添加{}
(4)break。case和default默认都跟随一个break语句,用于结束某个case,然后结束switch控制语句,执行switch后面的语句。

    运行逻辑:
    (1)如果表达式和某个case常量相等,执行这个case后面的语句。
    (2)如果没有和表达式相等的case常量,执行default后面的语句。

坑点:在每一个case分支最后,需要使用一个break跳出switch语句,否则,程序会执行后边的case语句,直到遇到一个break或者执行完整个case才能跳出switch语句,继续向后执行。

枚举

关于枚举,你需要知道的:

  1. 枚举属于构造类型
  2. 一组 具有名称的 整型常量。
  3. 目的:提高代码可读性。 标示符:人类可以识别 数字:计算机可以识别
  4. 语法:
            enum  枚举变量名 {
     
                标识符1, // 默认从0开始,也可以自定义。标识符对应的数值递增,增量为1
                标识符2,
                ...
     
            };
  1. 定义枚举类型写在函数外面
  2. 枚举类型变量每次只能赋一个数值,但是数值包含多种

示例代码
在main函数外定义一个枚举

enum ColorType {
    
    red,
    yellow,
    green = 10,
    blue
    
};

使用定义好的枚举:

    printf("%d %d %d %d\n", red, yellow, green, blue);
    
    enum ColorType color1 = red;
    enum ColorType color2 = yellow;
    enum ColorType color3 = green;
    enum ColorType color4 = blue;
    
    printf("color1 = %d\n", color1);
    printf("color2 = %d\n", color2);
    printf("color3 = %d\n", color3);
    printf("color4 = %d\n", color4);
C教程
Web note ad 1