原文首发于同名微信公号「Allen5G」,欢迎大家搜索关注,欢迎转发!
三目运算符(a ? b : c)可以作为逻辑运算的载体
规则:当a 的值为真时,返回b的值 , 否则返回c的值
实验1:三目运算符初探
#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; }
三目运算符(a ? b : c)的返回值类型
~通过隐式类型转换规则返回b 和 c中的较高类型
~当b 和c 不能隐式转换到同意类型时将编译出错
实验2:三目运算符的返回类型
#include <stdio.h> int main() { char c = 0; short s = 0; int i = 0; double d = 0; char* p = "str"; printf( "%d\n", sizeof(c ? c : s) ); printf( "%d\n", sizeof(i ? i : d) ); printf( "%d\n", sizeof(d ? d : p) ); return 0; }
逗号表达式:
实验3:逗号表达式实例
#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; }
实例4:一行代码实现strlen函数
#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("Delphi")); printf("len = %d\n", strlen(NULL)); return 0; }
小结:
三目运算符返回变量的值,而不是变量本身
三目运算符通过隐式转化规则确认返回值类型
逗号表达式按照从左到右的顺序计算每个子表达式的值
逗号表达式的值为最后一个子表达式的值