C语言基础第二节

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

布尔类型

布尔类型本质就是表示“是”或“不是”的变量。需要注意的是,在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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 关于 Swift 重要这个文档所包含的准备信息, 是关于开发的 API 和技术的。这个信息可能会改变, 根据这个文...
    无沣阅读 4,275评论 1 27
  • •1 C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使读者对c语...
    CONLYOUC阅读 8,696评论 9 66
  • 这两天有点空,不太踏实,明天要调整一下
    聂一一阅读 144评论 0 0
  • 南极料理人,列入我最喜欢的电影之一。有机会可以再看一次。 理由是,觉得完美演绎诠释了一个留美博士生的生活。看完你就...
    ritaxqzhang阅读 192评论 0 0
  • 按时下班总觉得有事情没做完心慌慌,只有夜幕下的独行才算得上结束一天,饥肠辘辘,内心静定。夜色茫茫才觉察出仲秋意。一...
    夏z远阅读 102评论 0 0