zoukankan      html  css  js  c++  java
  • 第18课 三目运算符和逗号表达式

    1. 三目运算符

    (1)三目运算符(a?b:c)可以作为逻辑运算的载体

    (2)规则:当a的值为真时,返回变量b的值(而不是变量本身);否则返回c的值。

    【实例分析】三目运算符初探

    #include <stdio.h>
    
    int main()
    {
        int a = 1;
        int b = 2;
        int c = 0;
    
        c = a < b ? a : b; //(a<b)?a:b;
    
        //以下代码试图根据条件有选择地给a或b变量赋值。但这样的
        //代码是错的,因为三目运算符的返回值是a或b变量的值,
        //而不是a或b变量本身,下列的代码相当于1=3;或2=3;
        //即要把3赋值给1或2。编译器会报错。
        //(a < b ? a : b) = 3; //error
    
        //要达到上述目的,可以改为如下代码,因为三目返回的是变
        //量a或b的地址,而不是变量a或b的值。
        *(a < b ? &a:&b) = 3;
    
        printf("a = %d
    ", a); //3
        printf("b = %d
    ", b); //2
        printf("c = %d
    ", c); //1
    
        return 0;
    }

    (3)三目运算符(a?b:c)的返回类型

      ①通过隐式类型转换规则返回b或c中较高的类型

      ②当b和c不能隐式转换到同一类型时将编译出错。

    【实例分析】三目运算符的返回类型

    #include <stdio.h>
    
    int main()
    {
        char c = 0;
        short s = 0;
        int i = 0;
        double d = 0;
        char* p = "str";
    
        printf("a = %d
    ",sizeof(c?c:s)); //将char和short隐式转为int,结果为4
        printf("b = %d
    ", sizeof(i?i:d)); //将i隐式转换为double,结果为8
        //printf("c = %d
    ", sizeof(d?d:p)); //错误,因为指针不能与基本类型隐式转换
    
        return 0;
    }

    2. 逗号表达式:exp1,exp2,epx3,…,expN;

    (1)逗号表达式是C语言中的“粘贴剂”

    (2)逗号表达式用于将多个子表达式连接为一个表达式

    (3)逗号表达式的值为最后一个子表达式的值

    (4)逗号表达式中的前N-1个子表达式可以没有返回值

    (5)逗号表达式按照从左向右的顺序计算每个子表达式的值

    【实例分析】逗号表达式的示例

    #include <stdio.h>
    
    void hello()
    {
        printf("Hello!
    ");
    }
    
    int main()
    {
        int a[3][3] = {
            (0, 1, 2), //注意是逗号表达式,不是{0,1,2}。相当于a[0]=2;
            (3, 4, 5), //注意是逗号表达式,不是{3,4,5}。相当于a[1]=5;
            (6, 7, 8)  //注意是逗号表达式,不是{3,4,5}。相当于a[1]=8;
        };
    
        //int a[3][3] = {
        //    { 0, 1, 2 }, //是大括号,相当于a[0]=0,a[1]=1,a[2]=2,以此类推!
        //    { 3, 4, 5 }, 
        //    { 6, 7, 8 }  
        //};
        int i = 0;
        int j = 0;
    
        //注意,以下是逗号表达式,以下会出现死循环吗?
        //答案是:不会!因为以下语句相当于
        //while (i<5)
        //    printf("i=%d
    ",i),hello(),i++;
        //而对于while语句来讲,循环体是分号结束(而不是逗号)
        //所以相当于加了大括号:{printf("i=%d
    ",i),hello(),i++;}
        while (i < 5)
            printf("i=%d
    ", i), //是逗号,不是分号!
    
        hello(),
    
        i++;
    
        for (i = 0; i < 3;i++){
            for (j = 0; j < 3;j++){
                printf("a[%d][%d] = %d
    ", i, j, a[i][j]);
            }
        }
    
        return 0;
    }

    【编程实验】一行代码实现strlen

    #include <stdio.h>
    #include <assert.h>
    
    //一行代码实现strlen
    int strlen(const char*s)
    {
        return assert(s), (*s ? strlen(s + 1) + 1 : 0);
    }
    
    int main()
    {
        printf("len = %d
    ", strlen("Hello World!
    ")); //len=13;
        printf("len = %d
    ", strlen(NULL)); //传入空指针,会断言失败!
        return 0;
    }

    3. 小结

    (1)三目运算符返回变量的值,而不是变量本身

    (2)三目运算符通过隐式类型转换规则确认返回值类型

    (3)逗号表达式按照从左向右的顺序计算每个子表达式的值

    (4)逗号表达式的值为最后一个子表达式的值

  • 相关阅读:
    微信 播放视频
    json与页面动态绑定
    layer mobile开发layer.full
    Layer 使用
    分享一段,图片加水印的代码。本人修改过多次
    jenkins .net linux
    Jenkins .net windows
    《微服务-架构与实践》
    分布式网站架构
    Go 并发随机打印1-n
  • 原文地址:https://www.cnblogs.com/5iedu/p/5324553.html
Copyright © 2011-2022 走看看