c语言逗号的运算法则,C之三目运算符和逗号表达式(十七)

我们经常在 C 语言中会见到三目运算符,那么我们今天来讲下三目运算符和一种特殊的逗号表达式。

首先来讲下三目运算符。什么是三目运算符呢?它的语法格式是 (a ? b : c)。三目运算符可以作为逻辑运算的载体,规则是:当 a 的值为真时,返回 b 的值;否则返回 c 的值。那么三目运算符的返回类型是怎样确定的?有两条规则:a> 通过隐式类型转换规则返回 b 和 c 中的较高类型;b> 当 b 和 c 不能隐式转换到同一类型时将编译出错。从某种程度上来说,它类似于 if ... else ... 语句,if(a) {b};     else {c}; 这样表达是不是更直观呢?

我们下来分析下面这个示例代码进行说明,代码如下:#include 

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;

}

我们根据上面的规则可知,第11行打印的是4,返回的类型应该是 int 型,因为 char 和 short 会隐式转换成 int;第12行应该打印的是8,返回的类型是 double;第13行应该会出错,因为我们在已知的隐式类型转换中没有指针的转换。我们编译下看看是否如我们所分析的那样

88ca2a53102279341c61134e79709b3f.png

那么第13行报的是类型不匹配,我们注释掉再次进行编译,结果如下

39561f217e5b8e7a40ac67a36b3221a0.png

结果和我们分析的一样。

下来我们来讲讲逗号表达式:a> 它是 C 语言中的“粘贴剂”; b> 用于将多个子表达式连接为一个表达式; c> 它的值为最后一个子表达式的值; d> 前 N - 1 个子表达式可以没有返回值; e> 按照从左向右的顺序计算每个子表达式的值;

我们来以下面的示例代码进行分析说明,代码如下:#include 

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 

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;

}

我们看到第 19 行的 while 循环,因为它下面的语句后面是逗号,一直到 i++ 才是分号,所以它会打印出 0 - 4,并且每句后面跟着一个 hello 函数打印出来的语句。第 26 行的 for 循环,因为之前的数组定义的是逗号的,所以它打印出来的是最后一个数字,也就是 2 5 8 了,其他全是0。我们来看看结果是否跟我们分析的一样

c2eeb7fa4b31894215056dee6998ec66.png

结果跟我们分析的一致。我们可以利用逗号表达式的特性写出用一句话实现的 strlen 函数,代码实现如下:#include 

#include 

int strlen(const char* s)

{

return assert(s), (*s ? strlen(s + 1) + 1 : 0);

}

int main()

{

printf("len = %d\n", strlen("hello"));

printf("len = %d\n", strlen(NULL));

return 0;

}

在这里我们使用了递归的思想,如果 s 为空串,则调用 C 语言中自带的 assert 函数进行说明,如果不是空的,那么字符加1一直到字符串的最后一位为 '\0' 为止。我们来看看编译结果是否如此

22f75ea6cba2d1f8cde79f9f43c9e20b.png

我们会看到调用正常字符串时,会输出它的长度。但如果是空串时,它会对 a.out 中的错误信息进行说明。我们看到如果逗号表达式如果使用的好的话,就会使我们的程序变得非常短小且效率高。

通过对三目运算符和逗号表达式的探究,总结如下:1、三目运算符返回变量的值而不是变量本身,通过隐式类型转换规则确认返回值类型;2、逗号表达式按照从左向右的顺序计算每个子表达式的值,它的值为最后一个子表达式的值。后面我们会继续对 C 语言的学习。

欢迎大家一起来学习C 语言,可以加我QQ:243343083。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值