[C++primer第四章]表达式

本文详细介绍了C++中的表达式、运算符及其规则,包括优先级、结合律、求值顺序。强调了短路求值、成员访问、条件运算符和位运算符的使用,并提醒开发者注意潜在的未定义行为。同时,讨论了类型转换、sizeof运算符以及逗号运算符的功能。此外,还提到了在代码中应避免的复杂表达式,提倡简洁的编程风格。
摘要由CSDN通过智能技术生成

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

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类型转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值