C语言简明讲解三目运算符和逗号表达式的使用

目录
  • 一、三目运算符
  • 二、逗号表达式
  • 三、小结

一、三目运算符

三目运算符( a ? b : c)可以作为逻辑运算的载体

规则:当 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) = 3;

    printf("%d\n", a);
    printf("%d\n", b);
    printf("%d\n", c);

    return 0;
}

编译时会发现报错:

这是因为三目运算符返回的是值,而不是变量,所以报错。

看看下面做法,将地址作为三目运算符的返回,就可以:

#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 不能隐式转换到同一类型时将编译出错

下面看一段代码,看看三目运算符的返回类型:

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

下面为输出结果:

char 和 short 在一起,返回 int 类型,占 4 个字节。

关于 char 和 short 返回 int 类型,我的理解如下:

如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。

double ←── float 高

long

unsigned

int ←── char,short 低

二、逗号表达式

  • 逗号表达式是C语言中的“粘贴剂”
  • 逗号表达式用于将多个子表达式连接为一个表达式
  • 逗号表达式的值为最后一个子表达式的值
  • 逗号表达式中的前 N-1 个子表达式可以没有返回值
  • 逗号表达式按照从左向右的顺序计算每个子表达式的值

如下:

下面看一个逗号表达式的示例:

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

下面为输出结果:

为什么打印出来的 a 数组和我们预想的不一样呢,这是因为

int a[3][3] = {

(0, 1, 2), (3, 4, 5), (6, 7, 8)

};

里面的逗号构成了逗号表达式,逗号表达式的值为最后一个子表达式的值,相当于

int a[3][3] = {

2,

5,

8

};

而且,二维数组的初始化也不是那样,而是

int a[3][3] = {

{0, 1, 2},

{3, 4, 5},

{6, 7, 8}

};

这点一定要注意,不要弄错!!!

下面再来看一个一行代码实现 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("Autumn"));
    printf("len = %d\n", strlen(NULL));

    return 0;
}

下面为输出结果:

三、小结

  • 三目运算符返回变量的值,而不是变量本身
  • 三目运算符通过隐式类型转换规则确认返回值类型
  • 逗号表达式按照从左向右的顺序计算每个子表达式的值
  • 逗号表达式的值为最后一个子表达式的值

到此这篇关于C语言简明讲解三目运算符和逗号表达式的使用的文章就介绍到这了,更多相关C语言 三目运算符内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言详细讲解位运算符的使用

    目录 一.位运算符分析 二.小贴士 三.位运算与逻辑运算 四.小结 一.位运算符分析 C语言中的位运算符 位运算符直接对 bit 位进行操作,其效率最高. & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 左移和右移注意点 左操作数必须为整数类型 char 和 short 被隐式转换为 int 后进行移位操作 右操作数的范围必须为:[0,31] 左移运算符<< 将运算数的二进制位左移 规则:高位丢弃,低位补0 右移运算符>> 把

  • C语言实现数学表达式运算

    本文实例为大家分享了C语言实现数学表达式运算的具体代码,供大家参考,具体内容如下 1.开发思路: (假设有表达式 2 * 3 * ( 1 + 2) ) 数字要一个一个取出放在内存中,根据相邻前后2个计算符号,判断是否要取出数字进行计算,2个数字的计算值重新放在内存中且顺序放置.考虑使用栈这种数据结构去保存数字和符号,用2个栈,1个栈保存数字,一个栈保存运算符号. 2.因要使用栈这种数据结构,本代码使用纯C语言开发,故先编写栈的代码,参考: c语言实现通用数据结构(三):通用椎栈 3.重要处理逻辑

  • 谈谈C语言中位运算你要知道的那些事儿

    目录 一.概念说明 1.概念 1.1位运算 1.2位运算符 2.举例及补充 2.1位运算 2.2位运算符 二.问题实战 1.问题描述(开放题) 2.输入输出 三.源码实现(+详细注释) 1.注释版 2.纯源码版 四.输出结果展示 1.输出结果 总结 一.概念说明 1.概念 先来看一下位运算的概念: 1.1位运算 位运算简单来说,就是按二进制位进行运算. 位运算: 从现代计算机中所有的数据二进制的形式存储在设备中.即 0.1 两种状态,计算机对二进制数据进行的运算(+.-.*./)都是叫位运算,即

  • C语言 详细讲解逻辑运算符的使用

    目录 一.&& 与 II 分析 二.!分析 三.小结 一.&& 与 II 分析 下面的程序运行结束后,i, j,k 的值分别为多少? #include <stdio.h> int main() { int i = 0; int j = 0; int k = 0; ++i || ++j && ++k; printf("i = %d\n", i); printf("j = %d\n", j); printf(&

  • C语言运算符的重载详解

    目录 写一个Add函数 为什么不用加号作为函数名 运算符的重载 上面问题解决 总结 写一个Add函数 我们先讨论下面代码,并复习前面的内容 class Complex { private: double Real, Image; public: Complex() :Real(0), Image(0) {} Complex(double r, double i) :Real(r), Image(i) {} ~Complex() {} //Complex Add(const Complex* co

  • C语言位运算符的具体使用

    目录 布尔位运算符 移位运算符 对于更多紧凑的数据,C 程序可以用独立的位或多个组合在一起的位来存储信息.文件访问许可就是一个常见的应用案例.位运算符允许对一个字节或更大的数据单位中独立的位做处理:可以清除.设定,或者倒置任何位或多个位.也可以将一个整数的位模式(bit pattern)向右或向左移动. 整数类型的位模式由一队按位置从右到左编号的位组成,位置编号从 0 开始,这是最低有效位(least significant bit).例如,考虑字符值'*',它的 ASCII 编码为 42,相当

  • C语言中各种运算类型全面总结

    目录 一.概述 二.四则运算 三.关系运算 四.逻辑运算与位运算 五.深度剖析位运算 一.概述 C语言中支持下面4种类型的运算 运算类型 运算符 四则运算 +,-,*,/,% 关系运算 <,>,<=,>=,==,!= 逻辑运算 &&,||,! 位运算 &,|,^,>>,<<,~ 二.四则运算 (+,-,*,/,%) 就是数学中的加,减,乘,除等运算 遵循先乘除后加减的运算优先级 可以使用括号改变运算顺序 注意: C语言中的除法运算,其

  • C语言简明讲解三目运算符和逗号表达式的使用

    目录 一.三目运算符 二.逗号表达式 三.小结 一.三目运算符 三目运算符( a ? b : c)可以作为逻辑运算的载体 规则:当 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) = 3; printf("%d\n", a); printf(&

  • C语言简明讲解类型转换的使用与作用

    目录 一.类型之间的转换 二.强制类型转换 三.隐式类型转换 四.表达式中的隐式类型转换 五.小结 一.类型之间的转换 C语言中的数据类型可以进行转换 强制类型转换 隐式类型转换 二.强制类型转换 强制类型转换的语法 (Type)var_name; (Type)value; 强制类型转换的结果 目标类型能够容纳目标值:结果不变 目标类型不能容纳目标值:结果将产生截断 注意:不是所有的强制类型转换都能成功,当不能进行强制类型转换时,编译器将产生错误信息(比如将自定义数据类型转换成基本数据类型).

  • C语言简明讲解操作符++和--的使用方法

    目录 一.++与--操作符的本质 二.++与-- 操作符使用分析 三.小结 一.++与--操作符的本质 ++ 和 -- 操作符对应两条汇编指令 前置 变量自增(减)1 取变量值 后置 取变量值 变量自增(减)1 下面看一段神奇的代码: #include <stdio.h> int main() { int i = 0; int r = 0; r = (i++) + (i++) + (i++); printf("i = %d\n", i); printf("r =

  • C语言简明讲解预编译的使用

    目录 小复习 1.内置符号 2.自定义符号 3.自定义宏 4.条件编译 小复习 预处理,预编译是编译的第一步. 会有三件基本的事情发生: 引入#include 去除注释 修改#define 1.内置符号 这些符号都可以直接使用: __FILE__            点c文件全名__LINE__            当前行号__DATE__            编译日期__TIME__            编译时间 举例: #include<stdio.h> int main() {

  • C语言简明讲解队列的实现方法

    目录 前言 队列的表示和实现 队列的概念及结构 代码实现 束语 前言 大家好啊,我又双叒叕来水博客了,道路是曲折的,前途是光明的,事物是呈螺旋式上升的,事物最终的发展结果还是我们多多少少能够决定的,好啦,吹水结束,这与这篇博客的主题并没有太多联系.关于栈和队列这一板块本来是想不写(就是想偷懒),但是想了想,觉得这样不太好,关于数据结构这一块可能会有缺失,所以最终还是决定写,必须补齐这一块,恰好最近有时间写博客,所以还是写了,这篇博客将介绍队列的知识点,理解链表那一块的操作后,栈和队列的相关操作还

  • C语言简明讲解变量的属性

    目录 一.C语言中的变量属性 二.auto 关键字 三.register 关键字 四.static 关键字 五.extern 关键字 六.小结 一.C语言中的变量属性 C语言中的变量可以有自己的属性 在定义变量的时候可以加上“属性”关键字 "属性”关键字指明变量的特有意义 语法: property type var_name; 示例: int main() { auto char i; register int j; static long k; extern double m; return

  • C语言简明讲解单引号与双引号的使用

    目录 一.单引号和双引号 二.小贴士 三.程序实例分析1 四.程序实例分析2 五.容易混淆的代码 六.小结 一.单引号和双引号 C语言中的单引号用来表示字符字面量 C语言中的双引号用来表示字符串字面量 'a'表示字符字面量,在内存中占1个字节,'a'+1表示'a'的ASCII码加1,结果为'b' "a"表示字符串字面量,在内存中占2个字节,"a"+1表示指针运算,结果指向"a"结束符'\0' 下面看一段单引号和双引号本质的代码: #include

  • C语言简明讲解归并排序的应用

    目录 一.归并排序 1.1归并排序引入 1.2归并排序的概念 1.3归并排序的原理 1.4实例说明 1.5具体步骤说明 1.6代码实现 1.7性能分析 一.归并排序 1.1归并排序引入 对于堆排序来说,因为用到了完全二叉树的深度是(log2n+1)的特性,所以效率就比较高,但是堆结构的设计比较复杂,现在我们想要可以直接利用完全二叉树来排序的方法,这个方法就是归并排序. 1.2归并排序的概念 归并排序是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比

  • C语言简明讲解快速排序的应用

    目录 快速排序 1.1快速排序引入 1.2快速排序的基本思想 1.3快速排序的排序流程 1.4实例说明 1.5代码实现 1.6性能分析 快速排序 快速排序,说白了就是给基准数据找其正确索引位置的过程 1.1快速排序引入 希尔排序相当于直接插入排序的升级,他们属于插入排序类:堆排序相当于简单选择排序的升级,他们同属于选择排序类:而对于交换排序类的冒泡排序升级版本就是快速排序. 1.2快速排序的基本思想 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字比另一部分记录的关键字小,则可分

  • 关于c语言逗号表达式的运算规则知识点

    c语言逗号表达式的运算规则 c语言逗号表达式是由左向右进行的:k=3*2=6,K+2=8,表达式返回8. 逗号表达式用法: 当顺序点用,结合顺序是从左至右,用来顺序求值,完毕之后整个表达式的值是最后一个表达式的值. 示例: #include <stdio.h> int main() { int a, s, d; s = 2; d = 3; a = (s + 2, d + 4); printf("%d\n", a); return 0; } 结果 7 注意事项 (1) 逗号表

随机推荐