温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C之三目运算符和逗号表达式(十七)

发布时间:2020-06-10 20:30:53 来源:网络 阅读:1897 作者:上帝之子521 栏目:编程语言

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

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

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

#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;
}

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

C之三目运算符和逗号表达式(十七)

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

C之三目运算符和逗号表达式(十七)

        结果和我们分析的一样。

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

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

#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;
}

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

C之三目运算符和逗号表达式(十七)

        结果跟我们分析的一致。我们可以利用逗号表达式的特性写出用一句话实现的 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("hello"));
    printf("len = %d\n", strlen(NULL));
    
    return 0;
}

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

C之三目运算符和逗号表达式(十七)

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

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


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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI