原创笔记,转载请注明出处!

点击【关注】,关注也是一种美德~


三目运算符在C编译器中的表现:

int main()

{

int a=10;

int b=20;

//三目运算符是一个表达式,表达式不能做左值

(a<b?a:b)=30;

printf("a=%d,b=%d",a,b);

return 0;

}

运行程序我们发现编译失败!

看原因我们看到是表达式不能做左值

这句话怎么理解呢?

C语言中,表达式的返回值是一个数,表达式的运算结果放在了CPU的寄存器里面,而不是内存中,不是一个内存地址(后面查笔记有关C和C++的左值、右值)。

也就是说在C语言中,a=10,b=20,执行a<b?a:b 语句,就是【10<20 吗?是的!好!那就返回a的值吧!】就把数字“10”返回了,接着就是 10=30,将30赋值给10?这是怎么个意思,就出错了!

在C++中,表达式返回的是变量的本身,也就是返回的变量a。

在C++中编译同样的代码:

#include<iostream>

using namespace std;

int main()

{

int a=10;

int b=20;

//三目运算符是一个表达式,表达式不能做左值

(a<b?a:b)=30;

printf("a=%d,b=%d",a,b);

system("pause");

return 0;

}

运行结果:

a=30,b=20

请按任意键继续...

那么在C语言中如何实现同样的效果呢?

我们想一下,如果想表达式能当左值,就是说三目表达式应该返回一个内存空间!也就是内存的首地址!内存的首地址是什么呢?就是指针吧。

a<b ? a:b 这个表达式就算完毕之后,我不想让它返回a的值10,如果我能返回a的地址,然后再给这个地址赋值那就可以了。

我可以这么写:(a < b ? &a : &b) = 30,通过这个地址就可以间接修改指针指向的内存空间,也就间接修改了a的值,注意在括号前面再加上星号“ * ”就是修改对应的值了。我们修改后再运行发现跟C++运行是一样的。

int main()

{

int a=10;

int b=20;

//三目运算符是一个表达式,表达式不能做左值

*(a<b?&a:&b)=30;

printf("a=%d,b=%d",a,b);

return 0;

}

运行结果:

a=30,b=20

Press any key to continue

所以,C++编译器是帮我们程序员完成了取地址的工作。

结论

1、 C语言返回变量的值,C++语言返回变量本身;

C语言中的三目运算符返回的是变量值,不能作为左值使用;

C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方。

2、注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用,如

(a < b ? 1 : b)= 30;

3、C语言如何支持类似C++的特性呢?

当左值的条件:要有内存空间,C++编译器帮助程序员取了一个地址而已。


原创笔记,转载请注明出处!

更多精彩请关注微信公众号:依法编程


C++笔记015:C++对C的扩展——三目运算符功能增强的更多相关文章

  1. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  2. BrnShop开源网上商城第六讲:扩展视图功能

    在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下.任何一个视图都会被翻译成一个c#类,并保存到指定的位置,然后被编译.这也就是为什么能在视图中包含c#代码片段的原因.下面我们通过一个项 ...

  3. 关于ligerui 中 grid 表格的扩展搜索功能在远程数据加载时无法使用的解决办法

    要想使用grid里的扩展搜索功能,除了要引用ligerui主要的js文件外,还必须引入下面的JS文件: 1.Source\demos\filter\ligerGrid.showFilter.js 2. ...

  4. php扩展Redis功能

    php扩展Redis功能 1 首先,查看所用php编译版本V6/V9 在phpinfo()中查看 2 下载扩展 地址:https://github.com/nicolasff/phpredis/dow ...

  5. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmvc学习笔记10-springmvc注解开发之商品改动功能 需求 开发mappe ...

  6. DEVOPS技术实践_17:Jenkins使用扩展邮件功能发送邮件

    一 环境准备 1.1 安装插件Email Extension 系统管理-管理插件-安装Email Extension插件 1.2 配置 配置jenkins邮箱的全局配置:系统管理-系统设置-完成邮箱配 ...

  7. 利用Mixins扩展类功能

    8.18 利用Mixins扩展类功能 - python3-cookbook 3.0.0 文档 https://python3-cookbook.readthedocs.io/zh_CN/latest/ ...

  8. ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

    一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...

  9. JavaScript学习笔记--ES6学习(四) 字符串的扩展

    ES6对字符串进行了一些扩展,主要表现在对Unicode 大于\uFFFF的字符的处理上. 1. ES6中字符的Unicode表示方法 在ES5中,字符串的Unicode表示方法: \uxxxx . ...

随机推荐

  1. Oql实体转自定义对象

    返回单体: GroupEnvironmentDTO 是自定义的一个DTO, GroupEnvironmentEntity.MapToPOCO(dto);  把上述查出来的对象转换为DTO 返回实体集合 ...

  2. 前端单元测试环境搭建 Karma Jasmine

    Karma 官网On the AngularJS team, we rely on testing and we always seek better tools to make our life e ...

  3. 网页简单布局之结构与表现原则(HTML/CSS)

    结构 样式 行为真正的分离 前端初级人员会在页面上单纯的用各个div把相关内容独立开: 前端中级人员明白相关属性的设置会给元素带来什么改变,从而减少div的书写: 前端高级人员会以及其简单的和稳定的方 ...

  4. 需求分析之WBS

    我们的产品就是当你把废旧的塑料瓶和电池投入回收箱中会产生能量,那么这能量可以干嘛呢那就通过我们的APP进行扫码记录所产生的能量这写能量可以在我们的APP的换吧中进行兑换用户所需要的东西比如:共享单车的 ...

  5. 用squid做http/https正向代理

    0.环境准备 VM1(server):nat-192.168.12.128 bridge-192.168.124.128 VM2(client):bridge-192.168.124.129 在VMw ...

  6. [翻译] ZFTokenField

    ZFTokenField 本人视频教程系类   iOS中CALayer的使用 效果图: iOS custom view that let you add token view inside like ...

  7. 乘风破浪:LeetCode真题_006_ZigZag Conversion

    乘风破浪:LeetCode真题_006_ZigZag Conversion 一.前言 到这里我们对基本的问题有了一定的理解,其中字符串的操作一直是一个比较困难的问题,这一点我们需要认真对待,采用合理的 ...

  8. 沉淀,再出发:结合案例看python

    沉淀,再出发:结合案例看python 一.前言 关于python,如果不经过大型程序开发的洗礼,我们很难说自己已经懂得了python了,因此,我们需要通过稍微结构化的编程来学习python. 二.一个 ...

  9. 10个值得深思的PHP面试题

    第一个问题关于弱类型 $str1 = 'yabadabadoo'; $str2 = 'yaba'; if (strpos($str1,$str2)) { echo "/"" ...

  10. Spring Security 自定义配置(1)

    @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapte ...