当前位置: 首页 > news >正文

C++要点总结_02_表达式与语句

目录

  • 2 表达式与语句
    • 2.1 算术运算符
    • 2.2 结合性与优先级
    • 2.3 表达式
    • 2.4 语句

2 表达式与语句

  1. 运算符就是具有运算功能的符号。
  2. “::” :作用域运算符。
  3. ->:成员指针运算符。
  4. 运算符种类:算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、移位运算符、sizeof运算符、条件运算符和逗号运算符。

2.1 算术运算符

  1. 算术运算符:的加(+)、减(-)、乘(*)、除(/)、模运算(%)、自增(++)、自减(–)。
// 算术运算符实例
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a=1,b=2;cout <<"a+b= "<< a+b <<endl;     // 1+2cout <<"a+100= "<< a+100 <<endl; // 1+100cout <<"a-b= "<< a-b <<endl;     // 1-2cout <<"a-100="<< a-100 <<endl;  // 1-100cout <<"a*b="<< a*b <<endl;     // 1*2cout <<"a*100="<< a*100 <<endl; // 1*100cout <<"a/b="<< a/b <<endl;     // 1/2cout <<"a/100="<< a/100 <<endl; // 1/100cout <<"a%b="<< a%b <<endl;     // 1%2cout <<"a%100="<< a%100 <<endl; // 1%100cout <<"a++:"<< a++ <<endl;     // 先赋值,输出1,a再自增,a+=1;a=2cout <<"a--:"<< a-- <<endl;     // 先赋值,输出2, a再自减,a-=1;a=1cout <<"++a:"<< ++a <<endl;     // a自增,a+=1;a=2,再输出2cout <<"--a:"<< --a <<endl;     // a自减,a-=1;a=1,再输出1return 0;
}
/* 运行结果:
a+b= 3
a+100= 101
a-b= -1
a-100=-99
a*b=2
a*100=100
a/b=0
a/100=0
a%b=1
a%100=1
a++:1
a--:2
++a:2
--a:1
Program ended with exit code: 0
*/
  1. 关系运算符:比较两个对象的大小,结果为true或false。
  2. 关系运算符种类:< ,> ,<= ,>= ,, !=。关系运算符
    的优先级低于算术运算符,高于赋值运算符。<,<=,>,>=的优先级相同,高于
    和!=,==和!=的优先级相同。
// 算术运算符实例
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a=1,b=200,c=0;printf("a>b: %d\n",a>b);   // 0 falseprintf("a>=b: %d\n",a>=b); printf("a<b: %d\n",a<b);   // 1 trueprintf("a<=b: %d\n",a<=b);printf("a==b: %d\n",a==b);printf("a+1==c: %d\n",a+1==c);printf("a!=b: %d\n",a!=b);return 0;
}/* 运行结果
a>b: 0
a>=b: 0
a<b: 1
a<=b: 1
a==b: 0
a+1==c: 0
a!=b: 1
Program ended with exit code: 0*/
  1. 逻辑运算符:对真和假这两种逻辑值进行运算,运算后的结果仍是一个逻辑值。
  2. &&:逻辑与。当两个对象都为真时,结果为真;有一个对象为假或两个对象都为假时,结果为假。
  3. ||: 逻辑或。当两个对象都为假时,结果为假;有一个对象为真或两个对象都为真时,结果为真。
  4. ! : 逻辑非。当对象为真时,运算结果为假;当对象为假时,运算结果为真。
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a =1, b=2,c=3;// && 逻辑与运算,两个表达式均为真,结果才为真。printf("(a>b && a> c): %d \n",a>b && a> c);printf("(a>b && a< c):  %d \n",a>b && a< c);printf("(a<b && a<c): %d \n",a<b && a<c);// ||  逻辑或运算,两个表达式均为真,结果才为真。printf("(a>b): %d \n",a>b || a> c);printf("(a>b || a< c):  %d \n",a>b || a< c);printf("(a<b || a<c): %d \n",a<b || a<c);// 逻辑非运算,表达式为真,去非之后,结果为假,反之为真。printf("!(a>b): %d \n",!(a>b));printf("!(a<b): %d \n",!(a<b));return 0;
}
/* 运行结果
(a>b && a> c): 0 
(a>b && a< c):  0 
(a<b && a<c): 1 
(a>b): 0 
(a>b || a< c):  1 
(a<b || a<c): 1 
!(a>b): 1 
!(a<b): 0 
Program ended with exit code: 0 
*/
  1. 赋值运算符:赋值运算符分为简单赋值运算符和复合赋值运算符,复合赋值运
    算符又称为带有运算的赋值运算符,简单赋值运算符就是给变量赋值的运算符。
  2. 复合赋值运算符:是等同的简单赋值运算符和其他运算的组合。
  3. 复合赋值运算符: +=、-=、*=、/=、%=、<<=、>>=、&= 、!=、^=。
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a =1, b=2,c=3;//  +=、-=、*=、/=、%=、<<=、>>=、&= 、!=、^=printf("a+=b: %d \n",a+=b);  // a = a+b = 1+2 =3printf("a-=b:  %d \n",a-=b); // a = a-b = 3-2 =1printf("a*=b: %d \n",a*=b);  // a = a*b = 1*2 =2printf("a/=b: %d \n",a/=b);  // a = a/b = 2*2 =1printf("a%=b:  %d \n",a%=b); // a = a%b = 1%2 =1printf("a<<=c: %d \n",a<<=c);// a = a*2*2*2 = 8printf("a>>=c: %d \n",a>>=c);// a = a/2/2/2 = 1printf("a&=c: %d \n",a&=c);  // a=a&c= 01(二进制)  & 11 (二进制) = 01(二进制) = 1(十进制)printf("a|=c: %d \n",a|=c);  // a=a|c= 01(二进制)  | 11 (二进制) = 11(二进制) = 3(十进制)printf("a^=c: %d \n",a^=c);  // a=a^c= 11(二进制)  | 11 (二进制) = 00(二进制) = 0(十进制)return 0;
}/*a+=b: 3a-=b:  1a*=b: 2a/=b: 1a=b:  1a<<=c: 8a>>=c: 1a&=c: 1a|=c: 3a^=c: 0Program ended with exit code: 0*/
  1. 位运算符:有&(位逻辑与)、|(位逻辑或)、^(位逻辑异或)和~(取反运算符)。
  2. 位运算优先级:在双目运算符中,位逻辑与优先级:最高,位逻辑或次之,位逻辑异或最低。取反运算符为单目运算符。
    13.位逻辑与:是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求与,若两个操作数对象同一位都为1,则结果对应位为1,否则结果中对应位为0。
    14.位逻辑或:是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求或,若两个操作数对象同一位都为0,则结果对应位为0,否则结果中对应位为1。
    15.位逻辑异或:将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求异或,若两个操作数对象同一位不同时为1,则结果对应位为1,否则结果中对应位为0。
    16.取反运算符:将操作数转换成二进制表示方式,然后将各位二进制位由1变为0,由0变为1。

#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a =1, b=2;printf("a&b: %d \n",a&b);  // 1&2 = (二进制) 01&10 =00(二进制) = 0  (十进制)printf("a|b: %d \n",a|b);  // 1|2 = (二进制)01|10 =11(二进制) = 3   (十进制)printf("a^b: %d \n",a^b);  // 1^2 = (二进制)01^10 =11 (二进制)= 3    (十进制)printf("~a: %d \n",~a);   // ~1 = (二进制)~00000001=10000010 (二进制)= -2  (十进制)return 0;
}
/*a&b: 0a|b: 3a^b: 3~a: -2Program ended with exit code: 0*/
  1. 移位运算符:<<(左移)和>>(右移),
  2. 左移: 将一个二进制操作数对象按指定的移动位数向左移,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用0补充。左移相当于乘以2的幂。
  3. 右移:将一个二进制的数按指定的位数向右移动,右边(低位端)溢出的位被丢弃,左边(高位端)的空位或者一律用0填充,或者用被移位操作数的符号位填充,运算结果和编译器有关,在使用补码的机器中,正数的符号位为0,负数的符号为1。
  4. sizeof运算符:sizeof(数据类型)、sizeof(表达式)。是唯一一个用到字母
    的运算符。sizeof(int);int a[10];sizeof(a);
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a[10];cout<<sizeof(int)<<endl;cout<<sizeof(a)<<endl;return 0;
}
/*  运行结果440Program ended with exit code: 0*/
  1. 条件运算符:C++中仅有的一个三目运算符,该运算符需要3个运算数对象,形式如下:<表达式1>?<表达式2><表达式3>。表达式1是一个逻辑值,可以为真或假。若表达式1为真,则运算结果是表达式2,如果表达式1为假,则运算结果是表达式3。这个运算相当于一个if语句。

#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a=1,b=2;a>b?cout<<"a>b"<<endl:cout<<"a<=b"<<endl;return 0;
}
/*  运行结果
a<=b*/
  1. 逗号运算符:。逗号运算符的优先级别最低,结合方向自左至右,其功能是把两个表达式连接起来组成一个表达式。逗号运算符是一个多目运算符,并且操作数
    的个数不限定,可以将任意多个表达式组成一个表达式。整个逗号表达式的值和类型由最后一个表达式决定。

2.2 结合性与优先级

  1. 运算符优先级决定了在表达式中各个运算符执行的先后顺序。高优先级运算符要先于低优先级运算符进行运算。
  2. 当表达式中出现了括号时,会改变优先级。先计算括号中的子表达式值,再计算整个表达式的值。

2.3 表达式

1.表达式:由运算符、括号、数值对象或变量等几个元素构成。一个数值对象是最简单的表达式,一个表达式可以看成一个数学函数,带有运算符的表达式通过计算将返回一个数值。
2. 表达式类型:算术表达式、关系表达式、条件表达式、赋值表达式、逻辑表达式和逗号表达式。
3. 表达式中的类型转换:隐式转换,强制类型转换。
4. 隐式转换:a.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。赋值时会把赋值类型和被赋值类型转换成同一类型,一般赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。b.int型和long型运算时,先把int量转成long型后再进行运算。所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再进行运算。char型和short型参与运算时,必须先转换成int型。
5. 强制类型转换:生在不同数据类型的量混合运算时,由编译系统自动转换数据类型。

#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a;short c = 1;char d = 65;float x =3.14;double y = x;a = -x;unsigned long aa = 100;cout<<"a:"<<a<<endl;cout<<"sizeof(d+c):"<<sizeof(d+c)<<endl;  // char 和short相加,现转换成int类型。cout<<"sizeof(y):"<<sizeof(y)<<endl;cout<<"sizeof(x+y):"<<sizeof(x+y)<<endl;cout<<"sizeof(a+aa):"<<sizeof(a+aa)<<endl;a = -10;cout<<"(a+aa):"<<(a+aa)<<endl;cout<<"int(x):"<<int(x)<<endl;return 0;
}/* 运行结果
a:-3
sizeof(d+c):4
sizeof(y):8
sizeof(x+y):8
sizeof(a+aa):8
(a+aa):90
int(x):3
Program ended with exit code: 0*/

2.4 语句

  1. 语句:语句是最小的可执行单元,一条语句由一个分号结束。
  2. 左值:内存当中持续储存的数据。
  3. 右值:临时储存的结果。
#include <iostream>
#include <type_traits>
#include <cmath>
using namespace std;int main(int argc, const char * argv[]) {int a=10;
//
//    cout<<"a+=a*=a/=a-6:"<<a+=a*=a/=(a-6)<<endl;int b =a+=a*=a/=a-6;cout<<"b:"<<b<<endl;int d=2,c;c = a+d;d = a;a = c-d;cout<<"a:"<<a<<endl;cout<<"d:"<<d<<endl;return 0;
}/* 运行结果
b:8
a:2
d:8
Program ended with exit code: 0*/

参考《C++从入门到精通》

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mongodb数据库运维之创建数据库及赋权限
  • 【解决方案】华普微汽车智能钥匙解决方案
  • 【2024蓝桥杯/C++/B组/传送阵】
  • 小程序开发_05
  • Vue 3 中使用 InMap 绘制热力图
  • kubernetes管理GUI工具Lens
  • 嵌入式软件工程师面试:RTOS相关问题全攻略
  • vue路由跳转时改变路由参数组件不渲染问题【已解决】
  • opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习
  • 回溯---组合
  • Postman中的灾难恢复演练:API的弹性测试策略
  • 数据资产治理:以业务价值为驱动
  • TPAMI 2024 | 全新框架!深度学习可解释度量学习!
  • 【ffmpeg命令入门】分离音视频流
  • 四步实现网站HTTPS访问
  • Django 博客开发教程 8 - 博客文章详情页
  • gulp 教程
  • Java 网络编程(2):UDP 的使用
  • JS实现简单的MVC模式开发小游戏
  • Linux后台研发超实用命令总结
  • MobX
  • Nacos系列:Nacos的Java SDK使用
  • Python 反序列化安全问题(二)
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • ucore操作系统实验笔记 - 重新理解中断
  • 程序员该如何有效的找工作?
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 听说你叫Java(二)–Servlet请求
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • $$$$GB2312-80区位编码表$$$$
  • ()、[]、{}、(())、[[]]命令替换
  • (备忘)Java Map 遍历
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (排序详解之 堆排序)
  • (七)glDrawArry绘制
  • .NET CLR基本术语
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET WPF 抖动动画
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET业务框架的构建
  • /run/containerd/containerd.sock connect: connection refused
  • @Transactional事务注解内含乾坤?
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [BUUCTF 2018]Online Tool