C语言三目运算符和逗号表达式

C/C++语言 同时被 3 个专栏收录
23 篇文章 4 订阅
19 篇文章 1 订阅
     一、三目运算符定义:(a ?b : c)  当a的值为真时,返回b的值;否则返回c的值
     二、三目运算符(a ?b : c) 返回类型:
                        1、通过隐试类型转换规则返回b和c中的较高类型

                        2、当b和c不能隐试转换到同一类型时将编译出错

          下面通过写一段代码测试下:       

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 0;
    
    char c1 = 0;
    short s = 0;
    int i = 0;
    double d = 0;
    char* p = "str";
    
    c = a < b ? a : b;
    
    (a < b ? a : b) = 3;//编译错误,因为三目运算符返回的是变量值,而不是变量,所以不能作为左值
    
    printf("%d\n", a);  //1
    printf("%d\n", b);  //2
    printf("%d\n", c);  //因为a < b所以为真,返回a的值,赋给c = a,所以c = 1
    
    printf( "%d\n", sizeof(c1 ? c1 : s) );//根据隐式类型转换,char和short会转换成int类型,所以是4
    printf( "%d\n", sizeof(i ? i : d) );  //根据隐式类型转换,int和double会转换成double类型,所以是8
    printf( "%d\n", sizeof(d ? d : p) );  //double和指针类型不能转换同一个类型,所以编译error
    
    return 0;
}

注释说的很明白,所以不讲了

        三、逗号表达式

         定义:逗号表达式是按照从左向右的顺序计算每个子表达式,逗号表达式的值是最后一个子表达式的值

         通过定义我们可以知道逗号表达式实际是将多个子表达式组合到一起,形成一个表达式,同时子表达式可以没有返回值

        下面通过写一段代码测试下:

#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 )  //因为 i< 0 所以执行printf()函数,打印i的值,也就是0
        printf("i = %d\n", i),//注意这里是一个逗号,不是分号
        
    hello(),  //输出”Hello!“  注意这里也是一个逗号,不是分号
    
    i++;      //i递增    注意这里才是逗号,所以while里面包含三条语句
        
    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;
}

再看下输出:


while循环里面执行了五次,这个好理解,因为while下面语句都是逗号,一直执行到分号,也就是i++后面,但是二维数组输出怎么只有[0]数组有数据,而且数据还不对,这是因为二维数组初始化不对造成的,正确初始化应该是这样的int a[3][3] = {{0,1,2},{3,4,5},{6,7,8}};中间不应该是(),中间是()时,编译器认为是逗号运算符,所以只有[0]数组有数据,而且是逗号最后的值,也就是2、5、8,其他数组都没有初始化,都是0

     四、再写一个面试可能考的题目,要求用一条语句实现int strlen(const char *p)函数

好吧直接写答案

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

这里注意:

             为什么要加assert();不加可以么?请自己仔细分析吧

参考资料:狄泰软件C语言进阶教程


  • 4
    点赞
  • 3
    评论
  • 17
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值