C++笔记015:C++对C的扩展——三目运算符功能增强
原创笔记,转载请注明出处!
点击【关注】,关注也是一种美德~
三目运算符在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的扩展——三目运算符功能增强的更多相关文章
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- BrnShop开源网上商城第六讲:扩展视图功能
在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下.任何一个视图都会被翻译成一个c#类,并保存到指定的位置,然后被编译.这也就是为什么能在视图中包含c#代码片段的原因.下面我们通过一个项 ...
- 关于ligerui 中 grid 表格的扩展搜索功能在远程数据加载时无法使用的解决办法
要想使用grid里的扩展搜索功能,除了要引用ligerui主要的js文件外,还必须引入下面的JS文件: 1.Source\demos\filter\ligerGrid.showFilter.js 2. ...
- php扩展Redis功能
php扩展Redis功能 1 首先,查看所用php编译版本V6/V9 在phpinfo()中查看 2 下载扩展 地址:https://github.com/nicolasff/phpredis/dow ...
- springmvc学习笔记(10)-springmvc注解开发之商品改动功能
springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmvc学习笔记10-springmvc注解开发之商品改动功能 需求 开发mappe ...
- DEVOPS技术实践_17:Jenkins使用扩展邮件功能发送邮件
一 环境准备 1.1 安装插件Email Extension 系统管理-管理插件-安装Email Extension插件 1.2 配置 配置jenkins邮箱的全局配置:系统管理-系统设置-完成邮箱配 ...
- 利用Mixins扩展类功能
8.18 利用Mixins扩展类功能 - python3-cookbook 3.0.0 文档 https://python3-cookbook.readthedocs.io/zh_CN/latest/ ...
- ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法
一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...
- JavaScript学习笔记--ES6学习(四) 字符串的扩展
ES6对字符串进行了一些扩展,主要表现在对Unicode 大于\uFFFF的字符的处理上. 1. ES6中字符的Unicode表示方法 在ES5中,字符串的Unicode表示方法: \uxxxx . ...
随机推荐
- GDAL2.0编译——32位和64位
准备工作: Source下载,这里下载对应的GDAL版本 https://trac.osgeo.org/gdal/wiki/DownloadSource 懒得编译也可以在这里下载对应版本 https: ...
- 工具Sequel Pro简介
从图中可以看到,sequel工作界面主要分成三部分,左边侧边显示的是当前所连接的数据库中存在的数据表,右侧上半部分则是用于写sql的地方,在Mac环境下按command+R键会执行你所写的sql,右侧 ...
- 我的C语言连接Mysql之路
1.安装好mysql 2.要实现C连接数据库,需要安装数据库连接器(即MySQL Connector/C) MySQL Connector/C是一个C语言的client库,这个库是为了实 ...
- INSERT 语句总结
一.基本语句 1.向指定的列中插入值(在插入批量数据时方式2优于方式1) <!--插入一条值--> INSERT INTO t1(field1,field2) VALUE(v001,v00 ...
- Python套接字
1.客户端/服务器架构 什么是客户端/服务器架构?对于不同的人来说,它意味着不同的东西,这取决于你问谁以及描述的是软件还是硬件系统.在这两种情况中的任何一种下,前提都很简单:服务器就是一系列硬件或软件 ...
- Mycat中间件
数据库中间件Mycat自我介绍 一.mycat概述 1.功能介绍 mycat一个开源的分布式数据库系统,是一个实现了mysql协议的server前端用户可以把它看成一个数据库代理,用mysql客户端工 ...
- 关于hashcode 里面 使用31 系数的问题
首先我们来了解一下hashcode,什么是hashcode?有什么作用? hashcode其实就是散列码,使用hashcode使用高效率的哈希算法来定位查找对象! 我们在使用容器来存储数据的时候会计算 ...
- SpringMVC与shiro集成及配置文件说明!
在项目中xml文件的配置是必不可少的,特别是SpringMVC框架.但是几乎所有项目的配置都是大同小异,很多人都是直接复制黏贴了事,不少人对其具体含义及用途都不甚全知.本片文章将正对项目中常用的框架S ...
- 书籍管理系统 -----没有form组件
urls: from django.contrib import admin from django.urls import path,re_path from first import views ...
- Exchange 2016证书配置
配置证书: 第一步,在ECP界面生成证书请求文件: 1.在“服务器 —>证书”界面,选择一台服务器,点击“+”来添加证书申请,如下图: 2.默认下一步, 3.填写证书的友好名称,如下图: 4.默 ...