• 第18课


    第18课 - 三目运算符和逗号表达式

    1. 三目运算符

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

    (2)规则:当a的值为真时,返回b的值;否则返回c的值

    三目运算符的本质就是 if...else... 语句,只不过三目运算符格式更加方便优雅。

    1 if (a)
    2   b;
    3 else
    4   c;

    【三目运算符初探】

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int a = 1;
     6     int b = 2;
     7     int c = 0;
     8 
     9     c = (a < b) ? a : b;
    10     // ((a < b) ? a : b) = 3;  // 编译报错 error: lvalue required as left operand of assignment
    11                                // 三目运算符最终返回的是一个值,而不是一个变量,不能作为左操作数
    12     // 1 = 10;    // error: lvalue required as left operand of assignment  相同的错误
    13 
    14     // 要想使用三目运算符对某一变量赋值,可以使用变量的地址进行操作
    15     *(a < b ? &a : &b) = 3;
    16 
    17     printf("a = %d
    ", a);  // 3
    18     printf("b = %d
    ", b);  // 2
    19     printf("c = %d
    ", c);  // 1
    20 
    21     return 0;
    22 }

    (3)三目运算符的返回类型

    • 通过隐式类型转换规则,返回b或c中较高的类型
    • 当b和c不能隐式转换到同一类型时将编译出错,类如指针与基本类型
     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     char c = 0;
     6     short s = 0;
     7     int i = 0;
     8     double d = 0;
     9     char* p = "str";
    10 
    11     printf("%zu
    ", sizeof(c ? c : s));   // char和short转换为int, 4
    12     printf("%zu
    ", sizeof(i ? i : d));   // int转换为double,8
    13     printf("%zu
    ", sizeof(d ? d : p));   // error: type mismatch in conditional expression
    14                                           // 指针和基本类型之间不允许隐式类型转换
    15 
    16     return 0;
    17 }

    2. 逗号表达式

    (1)逗号表达式是C语言中的"粘贴剂",多用于将多个子表达式连接为一个表达式

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

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

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

     1 #include <stdio.h>
     2 
     3 void hello()
     4 {
     5     printf("Hello!
    ");
     6 }
     7 
     8 int main()
     9 {
    10     // 二维数组使用大括号初{ }始化,不能使用小括号
    11     int a[3][3] = {
    12         (0, 1, 2),  // 注意这里是逗号表达式,最终结果为2
    13         (3, 4, 5),  // 注意这里是逗号表达式,最终结果为5
    14         (6, 7, 8)   // 注意这里是逗号表达式,最终结果为8
    15     };
    16 
    17     int i = 0;
    18     int j = 0;
    19 
    20     // 下面会出现死循环吗?
    21     while (i < 5)
    22         printf("i=%d
    ", i), // 注意这里是逗号而不是分号
    23 
    24     hello(),
    25 
    26     i++;
    27 
    28     for (i = 0; i < 3;i++){
    29         for (j = 0; j < 3;j++){
    30             printf("a[%d][%d] = %d
    ", i, j, a[i][j]);
    31         }
    32     }
    33     return 0;
    34 }

     

    逗号表达式的正确用法  ==>  一行代码实现strlen函数(使用递归实现)

     1 #include <stdio.h>
     2 #include <assert.h>
     3 
     4 int my_strlen(const char *s)
     5 {
     6     // return *s ? my_strlen(s + 1) +1 : 0;    // 没有考虑s为空指针
     7     
     8     return assert(s), (*s ? my_strlen(s + 1) +1 : 0);
     9 }
    10 
    11 int main()
    12 {
    13     printf("str len = %d
    ", my_strlen("2019-12-27 21:06:18"));
    14     printf("str len = %d
    ", my_strlen(NULL));
    15 
    16     return 0;
    17 }
  • 相关阅读:
    第九章(二)DAG上的动态规划
    第九章 (一)动态规划
    第八章(三)滑动窗口
    第八章 (二)贪心法
    斐波那契数列
    第七章 (四)BFS(路径寻找问题)
    TensorFlow——Graph的基本操作
    TensorFlow——共享变量的使用方法
    TensorFlow——常见张量操作的API函数
    TensorFlow——TensorBoard可视化
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/11853929.html
Copyright © 2020-2023  润新知