第18课 三目运算符和逗号表达式

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\n", a); //3
    printf("b = %d\n", b); //2
    printf("c = %d\n", 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\n",sizeof(c?c:s)); //将char和short隐式转为int,结果为4
    printf("b = %d\n", sizeof(i?i:d)); //将i隐式转换为double,结果为8
    //printf("c = %d\n", 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!\n");
}

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\n",i),hello(),i++;
    //而对于while语句来讲,循环体是分号结束(而不是逗号)
    //所以相当于加了大括号:{printf("i=%d\n",i),hello(),i++;}
    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;
}

【编程实验】一行代码实现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\n", strlen("Hello World!\n")); //len=13;
    printf("len = %d\n", strlen(NULL)); //传入空指针,会断言失败!
    return 0;
}

3. 小结

(1)三目运算符返回变量的值,而不是变量本身

(2)三目运算符通过隐式类型转换规则确认返回值类型

(3)逗号表达式按照从左向右的顺序计算每个子表达式的值

(4)逗号表达式的值为最后一个子表达式的值

时间: 2024-08-01 22:54:02

第18课 三目运算符和逗号表达式的相关文章

c语言中逗号运算符和逗号表达式

原文:c语言中逗号运算符和逗号表达式 C语言提供一种特殊的运算符——逗号运算符.用它将两个表达式连接起来.如: 3+5,6+8 称为逗号表达式,又称为“顺序求值运算符”.逗号表达式的一般形式为 表达式1,表达式2 逗号表达式的求解过程是:先求解表达式1,再求解表达式2.整个逗号表达式的值是表达式2的值.例如,上面的逗号表达式“3+5,6+8”的值为14.又如,逗号表达式 a=3*5,a*4对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达

重载逗号表达式

重载逗号表达式的注意点 首先复习一下逗号表达式 逗号操作符(,)可以构成逗号表达式 逗号表达式用于将多个子表达式连接为一个表达式 逗号表达式的值为最后一个子表达式的值 逗号表达式中的前N-1个子表达式可以没有返回值 逗号表达式按照从左向右的顺序计算每个子表达式的值         exp1,exp2,exp3,...,expn 重载逗号表达式 在C++中重载逗号操作符是合法的 使用全局函数对逗号操作符进行重载 重载函数的参数必须有一个是类类型 重载函数的返回值类型必须是引用 //重载逗号表达式

关于宏和逗号表达式

宏是C编译系统的预处理,何谓“预”?即是正式工作开始之前的准备工作.所以宏替换是在对程序编译之前进行的~也就是直接将宏定义的字符,转换成后面的表达式. 逗号表达式:逗号运算符,优先级别最低,它将两式联接起来,可连续执行 代码:直接对文件输出1-1000的数字 #include <stdio.h> #define B P,P,P,P,P,P,P,P,P,P #define P L,L,L,L,L,L,L,L,L,L #define L I,I,I,I,I,I,I,I,I,I,N #define

逗号表达式

/** 目的:逗号表达式的例子时间:2015年7月11日23:11:11 */#include <stdio.h> int main(void){ int i; int j = 2; i = (j++, ++j, j + 2, j - 3); printf("i = %d\n",i); printf("j = %d\n",j); return 0;} /** 在VC++6.0中运行结果为:------------------------ i = 1j =

Spark IMF传奇行动第18课:RDD持久化、广播、累加器总结

昨晚听了王家林老师的Spark IMF传奇行动第18课:RDD持久化.广播.累加器,作业是unpersist试验,阅读累加器源码看内部工作机制: scala> val rdd = sc.parallelize(1 to 1000) rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:21 scala> rdd.persist res0: rdd.type

3月3日完成第17课,准备开始第18课

昨天,也就是3月3日终于完成word文档"lvs+keepalived集群架构服务应用指南.doc"第17课的部分.之前,又完成1节51cto学院里,oldboy关于职业发展的视频笔记"linux运维人员需要具备的技能说明". 本来的计划是春节前完成第17课,没想到又拖成2个月. 第18课估计也不会好到那里去-- 我现在又开始纠结到底要不要进行MySQL的最后1课了,在公司根本就用不到MySQL.是不是要在换工作之前,先把4节shell课程完成再说呢? 先学能用的,

C++逗号表达式

转自:https://zhidao.baidu.com/question/106961628.html 逗号表达式的语法为: 表达式1,表达式2,...表达式n C++顺序计算表达式1,表达式2,--,表达式n的值.例如: int a,b,c: a=l,b=a+2, c=b+3: 由于按顺序求值, 所以能够保证b一定在a赋值之后, c一定在b赋值之后.该逗号表 达式可以用下面3个有序的赋值语句来表示: a=1: b=a+2: c=b+3: 逗号表达式是有值的,这一点是语句所不能代替的.逗号表达式

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform)让用户方便的操作数据库中的数据. 什么是ADO.NET 是一组库类,System.Data. Ado.net组成 Connection:用来连接数据库 Command:用来执行SQL语句 DataReader:只读.只进的结果集,一条一条读取数据(SteamReader.XmlReader) Da

C-1 简单数据类型转换, scanf缓冲区, 逗号表达式

关于类型转换: 1.int 如果是超出了int的范围,会溢出 如果超出了太多,报错 如果是一个小数,只会截取整数部分, 不会四舍五入 2.float 如果是一个double类型的小数,double→float 如果是一个int类型的整数,int→float 3.double 如果是一个float,float→double 如果是一个int,int→double 4.char 自动转换的顺序是: char → int → float → double scanf缓冲区问题 在接收输入的时候,sca