1、三目运算符
三目运算符(a?b:c)可以作为逻辑运算的载体
规则:当a的值为真时,返回b的值;否则返回c的值
下面的程序运行结束后, a, b, c的值分别为多少
int a = 1;
int b = 2;
int c = 0;
c =a < b ? a: b;
(a < b ? a : b) = 3;
2、实例分析
三目运算符初探 18-1.c
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a < b ? a : b;
(a < b ? a : b) = 3;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
三目运算符返回的是值不是变量,是值(C语言)
改写 : *(a < b ? &a : &b) = 3; //返回地址,通过*对地址内容修改
三目运算符(a?b:c)的返回类型
-通过隐式类型转换规则返回b和c中的较高类型
-当b和c不能隐式转换到同一类型时将编译出错
3、实例分析
三目运算符的返回类型 18-2.c
#include <stdio.h>
int main()
{
char c = 0;
short s = 0;
int i = 0;
double d = 0;
const char* p = "str";
printf( "%d\n", sizeof(c ? c : s) ); //int
printf( "%d\n", sizeof(i ? i : d) ); //double
//printf( "%d\n", sizeof(d ? d : p) ); //error: type mismatch in conditional expression
return 0;
}
4、逗号表达式
逗号表达式是C语言中的“粘贴剂”
逗号表达式用于将多个子表达式连接为—个表达式
逗号表达式的值为最后—个子表达式的值
逗号表达式中的前N-1个子表达式可以没有返回值
逗号表达式按照从左向右的顺序计算每个子表达式的值
- exp1, exp2, exp3, …, expN
5、实例分析
逗号表达式的示例 18-3.c
#include <stdio.h>
void hello()
{
printf("Hello!\n");
}
int main()
{
int a[3][3] = {
(0, 1, 2),
(3, 4, 5),
(6, 7, 8)
};
int i = 0;
int j = 0;
while( i < 5 )
printf("i = %d\n", i),
hello(),
i++;
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
}
}
return 0;
}
二维数组相当于:int a[3][3] = { 2, 5, 8 }
这是逗号表达式的滥用,下面看一个优秀的例子
6、编程实验
一行代码实现strlen 18-4.c
#include <stdio.h>
#include <assert.h>
int strlen(const char* s)
{
return assert(s), (*s ? strlen(s + 1) + 1 : 0);
}
int main()
{
printf("len = %d\n", strlen("Nyist"));
printf("len = %d\n", strlen(NULL));
return 0;
}
7、小结
三目运算符返回变量的值,而不是变量本身 (C语言)
三目运算符通过隐式类型转换规则确认返回值类型
逗号表达式按照从左向右的顺序计算每个子表达式的值
逗号表达式的值为最后一个子表达式的值