表达式C++
Posted wanluToPro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式C++相关的知识,希望对你有一定的参考价值。
第4章 表达式
什么是表达式?我可以简单地认为是需要运算的式子,官方的解释为表达式由一个或多个运算对象组成,对表达式求值将得到一个结果,字面值和变量是最简单的表达式,其结果就是字面值和变量的值。
基础
我们不必钻牛角尖,我们要通过实践向前看,通过实践一步步向前,当我们对整体有了解之后然后再回头来钻牛角尖、研究背后的道理。
基本概念
C++定义了一元运算符、二元运算符、三元运算符
//example1.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
//运算符举例
int i = 3;
int *ip = &i; //一元运算符&
int j = i * 3; //二元运算符
bool flag = false;
i = flag ? 23 : 43; //因为falg为false则右边表达式计算结果为43
cout << i << endl; // 43
/*
state?return if state is true:return if state if false
*/
return 0;
来其他运算,下面列举的有些我们已经在前面学过了,有些没有学习过
运算对象转换
也就是从一种类型转换到另一种类型,我们现在知道的有自动转换与强制转换,如果记得不太清楚可以翻到前面的章节进行回顾。
重载运算符
我们使用的cout<<中的<<就是对<<运算符的一种重载,但是我们现在不进行讨论,不然初学者或者小白肯定会懵逼的哦,后面我们会慢慢接触到的。
左值和右值
表达式可以分为左值和右值,左值可以位于赋值语句的左侧,右值不能。
优先级与结合律
复合表达式是指含有两个或者多个运算符的表达式,表达式通过运算方式连接在一起
//example2.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
int i = 6 + 3 * 4 / 2 + 2;
cout << i << endl; // 14
//程序上是怎样处理的呢
int j = (6 + ((3 * 4) / 2) + 2);
//这是上面复合表达式中运算符中的运算优先级
cout << j << endl; // 14
//我们可以自己使用括号来达到我们特定的效果
int k = 1 + 2 * 3;
cout << k << endl; // 7
k = (1 + 2) * 3;
cout << k << endl; // 9
//应用举例
int arr[] = 9, 1, 2, 3, 4;
cout << *(arr + 4) << endl; // 4
cout << *arr + 4 << endl; // 13
//在*arr+4中 *先于arr结合使用然后得到结果在参与+的运算
return 0;
求值顺序
运算符的优先级规定了运算对象的组合方式,但还有一点就是一个复合表达式中它们的计算顺序是怎样的
对于
f()+g()*h()+j()
对其规范地解释为,优先级规定g()与h()相乘,结合律规定,f()的返回值先与g()和h()的乘积相加,所得结果再与j()的返回值相加,对这些函数调用顺序没有明确规定。
C++没有明确指明大多数二元运算符左右表达式的运算顺序,但是在大多数编译器中都是从左到右的
举例代码
//example3.cpp
#include <iostream>
using namespace std;
int f1();
int f2();
int global_int = 1;
int main(int argc, char **argv)
int i = f1() + f2(); // 3 + 6
//在初始化i是右边的表达式f1()+f2()它们的执行顺序是怎样的呢
cout << i << endl;
// f1 excute gloal->2
// f2 excute gloal->4
// 9
//可见是从左到右执行,当f1执行得到结果后才会向后计算
cout << (f1() * 3 + (f2() * 3)) << endl;
// f1 excute gloal->5
// f2 excute gloal->7
// 45
//为什么?因为在此表达式中f1()*3的优先级与(f2()*3)相同
//二者会按照谁在前谁先执行
cout << f1() + f2() * 3 << endl;
// f1 excute gloal->8
// f2 excute gloal->10
// 45
//同理f1()与f2()*3同优先级,按照现后顺序执行
cout << f2() * 3 + f1() << endl;
// f2 excute gloal->12
// f1 excute gloal->13
// 56
//但是C++没有明确指明大多数二元运算符左右表达式的运算顺序,但是在大多数编译器中都是从左到右的
//也就是从C++的规定上,我们不知道f2()*3先执行还是f1()先执行
return 0;
int f1()
global_int += 1;
cout << "f1 excute gloal->" << global_int << endl;
return 1 + global_int;
int f2()
global_int += 2;
cout << "f2 excute gloal->" << global_int << endl;
return 2 + global_int;
算数运算符
填坑中
逻辑和关系运算符
填坑中
赋值运算符
填坑中
递增和递减运算符
填坑中
成员访问运算符
填坑中
条件运算符
填坑中
位运算符
填坑中
sizeof运算符
填坑中
逗号运算符
填坑中
类型转换
填坑中
运算符优先级表
填坑中
以上是关于表达式C++的主要内容,如果未能解决你的问题,请参考以下文章