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

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


三目运算符在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. 配置文件出错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): <!-- mybatis 配置- ...

  2. Android 性能优化的方面方面都在这儿

    又到周六了,鸿洋的不定期的周六放送又来了~~这次来谈谈性能优化吧.大家在工作中或多或少都会拿自家的应用和竞品app做比对,不可避免的需要做一些app性能优化的活.很多时候可能是策略上的调整,不过还是有 ...

  3. Python爬虫教程-04-response简介

    Spider-04-response简介 本小节介绍urlopen的返回对象,和简单调试方法 案例v3 研究request的返回值,输出返回值类型,打印内容 geturl:返回请求对象的url inf ...

  4. Volley1--为什么说Volley适合数据量小,通信频繁的网络操作

    前言 网络编程对于客户端来说是一块及其重要的地方,使用高效的网络请求框架将为你的系统产生很大的影响.而Volley作为谷歌的一个开源项目,炙手可热.有很多中小型公司的安卓移动客户端的网络程序都是基于v ...

  5. android.view.WindowLeaked的解决办法

    按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个WindowManage ...

  6. [翻译] AsyncDisplayKit

    AsyncDisplayKit AsyncDisplayKit is an iOS framework that keeps even the most complex user interfaces ...

  7. php & laravel 相关收集

    http://www.oschina.net/news/49207/best-php-debugging-tools 调试相关工具 https://github.com/barryvdh/larave ...

  8. Spotlight监控Linux服务器

    1.安装 Spotlight on Unix 下载地址:http://worlddownloads.quest.com.edgesuite.net/Repository/www.quest.com/l ...

  9. 操作dict时避免出现KeyError的几种方法

    在读取dict的key和value时,如果key不存在,就会触发KeyError错误,如: Python t = { ', ', ', } print(t['d']) 就会出现: <code c ...

  10. 【JavaScript】particle

    这是js实现的粒子动画,有两种模式,分别是zoom和line,它们对应的效果不同,但是原理都相同,具体分析如下: 部分程序如下: var p = this; p.originParams = orig ...