第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\n", a);  // 3
18     printf("b = %d\n", b);  // 2
19     printf("c = %d\n", 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\n", sizeof(c ? c : s));   // char和short转换为int, 4
12     printf("%zu\n", sizeof(i ? i : d));   // int转换为double,8
13     printf("%zu\n", 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!\n");
 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\n", 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\n", 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\n", my_strlen("2019-12-27 21:06:18"));
14     printf("str len = %d\n", my_strlen(NULL));
15 
16     return 0;
17 }

 

posted @ 2019-11-13 22:53  Hengs  阅读(348)  评论(0编辑  收藏  举报