第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 }