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)逗号表达式的值为最后一个子表达式的值。