表达式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++的主要内容,如果未能解决你的问题,请参考以下文章

一个实验性的C++编译期正则表达式parser

c++基础(lambda)

C++ 中的二进制字面量

C语言表达式怎么计算?

托管 C++ 中的逐字字面量? (就像 C# 的 @"blah")

C++基础知识之常量(字面量) 变量