左值,右值 及(++a)+=(a++)和(++a)=(++a)+(a++)计算

2024-05-12 07:32
文章标签 计算 右值 左值

本文主要是介绍左值,右值 及(++a)+=(a++)和(++a)=(++a)+(a++)计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在赋值语句中,赋值运算符“=”左,右两边的变量名扮演者两种不同的角色。对赋值运算符右边的B我们需要的是它的值,对左边的A我们需要的是他所代表的存储单元(的地址)。为了区分一个名字的这两种特征,

我们把一个名字所代表的单元(地址)称为该名的左值把一个名字的值称为该名的右值

(左值既可以在等号右边又可以在等号左边,但是右值只能在等号右边)

前置自增和后置自增的重要区别?

  ++a    前置自增能够用做左值表达式(前置自增返回操作数本身)

  a++    后置自增只能用与右值表达式(后置自增返回一个临时变量)。

 如:

 int main{int  a=3;a+=(a++);     //+=运算符是从右向左运算,temp=a;a+=temp;a=a+temp=3+3;所以cout<<a+=(a++);结果为6(cout<<(a=a+temp),a++;),最后执行a+1 cout<<a<<endl; //7    再次强调 ,如果上面直接输出cout<<a+=(a++)结果为6.理解这个下面就好理解了a+=(++a);cout<<a<<endl; //16(++a)+=(a++);                   //改为(++a)+=(++a)cout<<a<<endl; //35             //此时cout<<a<<endl;   //结果为36//(a++)+=a; 会出现编译错误return 0;}


  (++a)+=(a++)和(++a)=(++a)+(a++)的区别?

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. void main()  
  4. {  
  5.   int a=4;  
  6.   cout<<((++a)+=(a++))<<endl;   //结果为10 
  7.   cout<<a<<endl;              //结果为11  
  8.   system("pause");  
  9. }  
[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. void main()  
  4. {  
  5.   int a=4;  
  6.   cout<<((++a)=(++a)+(a++))<<endl; //结果为12   
  7.   cout<<a<<endl;              //结果为13  
  8.   system("pause");  
  9. }  

两者结果不一致,为什么呢?

首先先说说为什么(i++)不能做左值而(++i)可以。

[cpp]  view plain copy
  1. //前缀形式,如++a  
  2. int &int::operator++()  
  3. {  
  4.    *this+=1;  
  5.    return *this;  
  6. }  
  7.   
  8. //后缀形式,如a++,由于返回的是副本,所以设定了const int,因为给oldvalue赋值是危险的,函数出栈动作结束后,oldvalue就消失了。  
  9. const int int::operator++(int)  
  10. {  
  11.    int oldvalue=*this;  
  12.    ++(*this);  
  13.    return oldvalue;  
  14. }  
那么(++a)+=(a++)和(++a)=(++a)+(a++)的结果为什么不同呢?

(++a)+=(a++)

其实是先++a,那么a变成5,(a++)之后返回副本值temp还是5,所以出现cout<<(++a)+=(a++)结果为a=a+temp=10.(此时a中的值不变,还为5) 当这条语句执行结束后,此时a++ ,a 的值由10变为11;

若改为(++a)+=(++a) 那结果就变为12咯。所以++a返回的是变量a所在内存单元的地址这点很重要((++a)执行后就可看为a+=(++a),此时的a的初始化值可以看做5. 所以a+=(++a)==>a=a+a===>a=6+6=12 

(++a)=(++a)+(a++);

同样是先++a,那么a变成5,遇到“=”时从右向左执行,此时++a后,a变为6,(++a)这部分值为6,在执行a++,将a赋值给临时变量temp=6;

所以cout<<(++a)=(++a)+(a++) 结果为cout<<(a=6+temp) ==> cout<<a==>12;  所以此时a=12,当这条语句执行完后再执行a++,a变为13.此时表达式cout<<a;结果为13;

这篇关于左值,右值 及(++a)+=(a++)和(++a)=(++a)+(a++)计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981986

相关文章

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

Java - BigDecimal 计算分位(百分位)

日常开发中,如果使用数据库来直接查询一组数据的分位数,就比较简单,直接使用对应的函数就可以了,例如:         PERCENT_RANK() OVER(PARTITION BY 分组列名 ORDER BY 目标列名) AS 目标列名_分位数         如果是需要在代码逻辑部分进行分位数的计算,就需要我们自己写一个工具类来支持计算了 import static ja

OpenStack离线Train版安装系列—2计算节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

新一代车载(E/E)架构下的中央计算载体---HPC软件架构简介

老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节能减排。 无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事.而不是让内心的烦躁、焦虑、毁掉你本就不多的热情和定力。 时间不知不觉中,快要来到夏末秋初。一年又过去了一大半,成