C++ 部分运算符、运算规则的优先级


C++ 部分运算符的优先级

主要是一些不太清晰的运算符优先级记录

一、复合表达式中优先级的情况

在复合表达式中若干子表达式指向并修改了同一个对象,可能会出现一些无法预知的情况。

	int i = f1() * f2()	//	在运算中,不同的编译器对于先执行f1()还是f2()不一定
	
	int j = 0;
	cout << j << " " << ++j << endl;	//	同上,不同编辑器中无法预知先执行j还是++j

二、赋值运算符优先级

赋值运算符的优先级贼低。

	int i;
	while (i = 5 != 42) {
		cout << i << endl;	//	先运算不等于语句,再赋值,输出i为1	
		// 其他处理
	}
	
	int j;
	while ((j = 5) != 42) {
		cout << j << endl;	//	先赋值,在进行不等于语句,输出j为5	
		// 其他处理
	}

三、混用解引用和递增运算符优先级

解引用的优先级高于递增运算符。

	int a[2] = {1, 3};
	int * iter = a;
	int * iter1 = a;
	// 假设ptr是一个指针
	cout << *iter++ << endl;	//	 先解引用iter,创建副本输出1,然后iter指针地址加1
	cout << ++*iter1 << endl;	//	输出2,相当于是先解引用iter,然后对其指向的值进行++

四、条件运算符优先级

条件运算符的优先级非常低,并采用右结合律。

	int grade = 50;
	string finalgrade = (grade > 90) ? "high" : (grade > 70) ? "middle" : "low";	//	先是结合后一堆的条件表达式,然后把其的结果作为前一个表达式的结果分支
	cout << grade < 60 ? "low" : "middle" << endl;	//	错误:先运行cout << grade,之后是cout<60作为判断对象

五、移位运算符优先级

移位运算符的优先级不高不低,介于中间:比算术运算符优先级低,但是比逻辑运算符优先级高。

	cout << 42 + 10 ;	//	正确:输出求和结果
	cout << (10 < 42) ;	//	正确:输出比较结果
	cout << 10 < 42 ;	//	错误:先运算cout << 10,得出cout对象,将cout对象与42比较。

六、点运算与解引用优先级

点运算符的优先级比解引用优先级高。

	string s1 = "ceshi"; * p = &s1;
	auto n = s1.size();
	n = (*p).size();	//	正确:通过解引用p取到string对象s1,调用其size()成员函数
	n = p->size();	//	正确:箭头运算符为点运算符加解引用的结合,效果和上式一样
	n = *p.size();	//	错误:先运算点运算符,取p的size()成员函数,但是p是一个指针,没有该函数

七、函数调用优先级

调用运算符的优先级与点运算符和箭头运算符相同。

	auto sz = shorterString(s1, s2).size();
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值