IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [C++primer第四章]表达式 -> 正文阅读

[C++知识库][C++primer第四章]表达式

表达式由一个或多个运算对象组成,对表达式求值将得到一个哥结果。
字面量和变量是最简单的表达式。

4.1基础

一元运算符: &、^、*(解引用)
二元运算符: ==、+
运算对象转换:在表达式求值的过程中,运算对象常由一种类型转换为 另外一种类型,小整型(char、bool、short)通常会被提升为大整型(int)

重载运算符 IO库的<< 、>>以及string、vector对象和迭代器使用的运算符都是重载的运算符。

4.1.2优先级和结合律

程序员可以使用括号将表达式某个局部括起来使其得到优先运算,优先级和结合律会影响程序的正确性。

4.1.3求值顺序

		int i = f1() * f2(); 

我们知道f1和f2一定会在执行乘法之前被调用,但是我们无法知道到底f1先调用还是f2先调用。
对于没有指定那些没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将会产生未定义的错误。如

	int i = 0;
	cout<< i << ' ' << ++i <<endl; // 不确定的输出结果

编译器可能先求++i,再求i,也有可能先求i再++i.
求值顺序、优先级、结合律

	_f() + g() *h() + j()_
  • 优先级规定:g()的返回值和f()的返回值相乘
  • 结合律规定:f()的返回值相合gh乘积相加,最后加j()
  • 对于这些函数的调用顺序没有明确规定。

4.2算术运算符

C++除法是向下取整。

  • m % (-n) = m % n
  • (-m)%n = -(m%n)

4.3逻辑和关系运算符

逻辑与&&和逻辑或||都是先求左侧运算对象,再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式结果时才会计算右侧运算对象的值,这称为短路求值。

4.4赋值运算符

a += i;
a -= i;
a <<= i ;
a ^= i;
它和a = a + i; 唯一不同的区别是运算对象的求值次数,对程序性能的影响几乎可以忽略不计。

4.5递增和递减运算符

C++primer推荐尽量用 ++i(前置版本) ,
尽量不用i++(后置版本)
性能上有区别,写出的代码也要复合编程的初衷。

	auto pbeg = v.begin();
	while(pebg != v.end() && *pebg >= 0)
		cout<< *pebg++ <<endl;
	输出pebg的值并向前移动一个元素

递增运算符的优先级高于解引用运算符,
因此*pebg++等价 *(pebg++)

建议:简介有时是一种美德,有些表达式其实是广泛使用、有效的,应该习惯这种写法,追求简洁,摒弃冗长


	for(auto it = s.begin();it!=s.end()&&!isspace(*it);++it)
		*it = toupper(*it);
	//正确
	auto it = s.begin();
	while(it!=s.end()&&!isspace(*it))
		*(beg+1) = toupper(*beg);
	错误,赋值运算符左右两端都用到了it,右侧it的值还改变了,所以赋值语句是未定义。

4.6成员访问运算符

4.7条件运算符

条件运算法 (?:)允许我们把简单的if-else逻辑嵌入到单个表达式中,例如

		string finalgrade = (grade < 60)?"fail":"pass";

允许在条件运算符内部潜逃另外一个条件运算符,例如

	finalgrade = (grade>90)?"high"
				 :(grade>60)?"pass":"fail";

在输出中使用条件运算符,由于条件运算符优先级很低,因此常在其两端加括号

	cout<<((grade<60)?"fail":"pass";); // 正确
	cout<<(grade<60)?"fail":"pass"; // 输出1或0

    第二条语句等价于:
    cout<<(grade<60);
    cout?"fail":"pass";// 根据cout的值是true还是false产生对应的字面值

4.8位运算符

    求反:~
    左移:<<
    右移:>>
    按位与:&
    按位异或:^
	
	例如:unsigned a = 0233;    // 八进制形式
	 a = 0 1 0 - 0 1 1 - 0 1 1 // 二进制形式
	 a << 8 ;
  a	= 000000000 00000000 10011011 00000000
     a << 31
  a = 10000000 00000000 00000000 000000000
  	 a >>3
  a = 00000000 00000000 00000000 00-010011   
 用T(1) 的空间复杂度实现全班三十个同学挂不挂科的检测。


------------待补充------------------

4.9 sizeof运算符

sizeof运算符返回一条表达式或一个类型名字所占的字节数
有两种形式:

	sizeof(type)
	sizeof expr

sizeof 还能获取整个数组的大小例如

 		int ia[N];
 		cout<< sizeof(ia)/sizeof(*ia); // 输出N-1

4.10逗号运算符

规定了运算对象求值的顺序。
逗号运算符真正的结果是最右侧表达式的值

4.11类型转换

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:15:23  更:2021-10-12 23:17:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 19:30:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码