C++中的运算符和表达式

目录
  • (1)算术表达式
  • (2)赋值运算符
  • (3)逗号运算符
  • (4)关系运算符
  • (5)三元表达式
  • (6)sizeof函数
  • (7)数据类型转换
    • (7.1)显式转换
    • (7.2)隐式转换
  • (8)总结

在编程语言中“表达式”可以近似于“公式”,也就是按照自己的预期进行某种计算,表达式由运算符合操作数等构成。C++中包含单目(一元)运算符、双目(二元)运算符和三目(三元)运算符,相应的构成了多种表达式。运算符具有优先级和结合性,优先级指先后计算次序,结合性指同级运算符时按照自左向右还是自右向左进行计算。

(1)算术表达式

算术表达式由算术运算符、操作数和括号构成,基本运算符包含:加+、减-、乘*、除\、取余%,只有“加、减”在做“正、负”符号时是一元运算符,其余情况都是二元运算符。C++拥有自加++和自减--两个一元运算符(python应该没有自加和自减,因为python中数值是不可变类型,改变值会申请新的内存),当表达式中存在自加或者自减运算时,一定要注意自加和自减是在操作数之前还是操作数之后,在操作数之前表示先自加再计算整个表达式,在操作数之后表示先计算整个表达式再自加,

比如下面的代码:

int age_1 = 22;
int age_2 = 22;
int new_age_1;
int new_age_2;
new_age_1 = age_1++;
new_age_2 = ++age_2;

第5行计算new_age_1时,先计算完整个表达式,再进行age_1的自加,所以new_age_1

等于22;第6行计算new_age_2时,先对age_2进行自加,再进行表达式计算,所以new_age_2等于23。自己在写代码时最好不要给自己挖坑,少使用过于复杂的表达式。

(2)赋值运算符

赋值运算符“=”是双目运算符,结合性是自右向左,允许连续赋值:

int x, y, z;
x = y = z = 1;

此外,C++还有+=、*=、/=等等运算符,结合性都是自右向左。

(3)逗号运算符

逗号运算符可以分隔两个表达式,先计算左边表达式再计算右边的表达式,但是由于逗号运算符的优先级低于赋值运算符,所以采用逗号运算符进行赋值时必须把逗号表达式括起来,

下面两行代码得到的x值是不同的:

x = (2, 3);
x = 2, 3;

第一行x等于3,第二行x等于2,因为逗号运算符的优先级低于赋值运算符,自己在使用中必须小心。

(4)关系运算符

关系运算符是逻辑表达式的基础,C++包含的关系运算符分两个优先级,较高的优先级为:大于、小于、大于等于和小于等于四种,分别用<、<=、>、>=来表示;较低的优先级为:等于、不等于,分别用==、!=表示。逻辑表达式返回的值为布尔类型,判断为真返回True(0),判断为假返回False(1),

如下:

int x = 2;
int y = 3;
bool result;
result = (x >= y);

C++还拥有三个逻辑运算符:与、或、非,分别用||、&&、!三个符号表示。

(5)三元表达式

据自己目前所知,C++唯一的三元运算符是条件运算符,其语法如下:

条件判断? 表达式1:表达式2

当判断条件成立时,执行表达式1;当判断条件不成立时,执行表达式2,

代码如下:

int x = 2;
int y = 3;
int result;
result = (x>y? 10: 1000);

由于x>y不成立,所以执行表达式2,也就是result被赋值为1000。

(6)sizeof函数

书中称sizeof为单独的运算符,为了便于理解这里把其视为函数。sizeof可以求取对象的占用的字节数,下面的例子计算了int类型占用的字节数:

int result=1000;
cout << sizeof(result) <<endl;

输出为4,表示int占用4个字节,这和理论上是一致的。

(7)数据类型转换

数据类型转换是编程语言面临的共同问题,对于表达式中存在多种数据类型的情况必须采用有效的处理策略。C++数据类型转换包含显式转换和隐式转换两种,下面分别进行介绍。

(7.1)显式转换

如果自己清晰的知道表达式中各个对象是什么类型,并且清晰的知道想要将对象变为何种新的类型,那么可以使用:类型说明符(表达式)进行显式的类型转换,

比如将float类型的x转换为int类型的y:

float x = 6.66;
int y = int(x);   

上述代码运行后y的值为6,仅仅取x的整数部分。显式类型转换时,如果自己选择的类型说明符的精度较低,比如上述代码中x为高精度,但是类型说明符int为低精度,则数据类型转换过程中造成了精度丢失。

(7.2)隐式转换

如果表达式中有高精度和低精度两种数据参与计算,会自动将低精度数据转换为高精度数据进行计算,这种隐式转换是没有精度丢失的安全转换:

float x = 6.66;
int y = 2;
cout << x+y <<endl;

上述代码中浮点x和整型y进行加法时,按照浮点类型进行计算输出6.66。

另外,逻辑表达式中0和非0数据分别会被转换为true和false,赋值表达式自动将等号右边的类型转换为等号左边的类型。

(8)总结

C++的包含的运算符和表达式总体来说和python差不多,类型转换的规则也很符合直观的理解。位运算符部分暂时没进行记录是因为其并不常用,等用到的时候再学习。

参考:

  • 郑莉《C++语言程序设计》

到此这篇关于C++中的运算符和表达式的文章就介绍到这了,更多相关C++运算符和表达式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 正则表达式的应用详解

    目录 一.为什么要学正则表达式 C++string处理: 二.正则程序库(regex) 正则文法: 正则库: 匹配(Match) 搜索(Search) 替换(Replace) 一.为什么要学正则表达式 若要判断一个输入的QQ号是否有效,如何判断? 判断步骤: 长度大于5,小于等于10: 首位不能为0: 是否为纯数字? C++string处理: #include<iostream> using namespace std; int main() { string qq = "7466a

  • C++赋值运算符

    C++当中允许类对象赋值,这是通过默认的重载赋值运算符实现的,它的原型如下: Class_name & Class_name::operator=(const Class_name &); 它接受并返回一个指向类对象的引用. 将已有的对象赋给另一个对象时,将会使用重载的赋值运算符: StringBad headline1("Celery"); StringBad knot; knot = headline1; // 调用赋值运算符 如果是对象初始化的过程,则不一定会使用

  • C++成员解除引用运算符的示例详解

    下面看下成员解除引用运算符,C++允许定义指向类成员的指针,对这种指针进行声明或解除引用时,需要使用一种特殊的表示法.例: class Example { private: int feet; int inches; public: Example(); Example(int ft); ~Example(); void show_in()const; void show_ft()const; void use_ptr()const; }; 如果没有具体的对象,则inches成员只是一个标签.也

  • C++中Lambda表达式的语法与实例

    目录 概述 语法分析 捕获列表 关键字声明 mutable exception 示例 捕获列表按值传递 捕获列表按引用传递 总结 概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作.Lambda 的语法形式如下: [捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体} //计算两个值的和 auto func = [](int a, int b) -> int{return a+b;}; //当返回值的类型是确定

  • C++三元表达式详情

    if-else语句非常常用,但在进行一些简单逻辑判断的时候,会显得有些不太简洁.特别是在初始化的时候,比如我们有一个变量,某种情况下赋值成a,另外的情况下赋值成b. 使用if-else语句写出来就是: int cur; if (condition) { cur = a; }else { cur = b; } 这当然是没问题的,只是在大量使用的时候会显得有些繁琐.因此C++当中推出了三元表达式对此进行简化,三元表达式也被称为条件运算符(?:). 运算符的通用格式如下: condition ? ex

  • C++构造函数+复制构造函数+重载等号运算符调用

    目录 前言: 1.赋值和初始化的区别 2.初始化和赋值分别调用哪个函数? 3.编写测试类 前言: 初学C++发现了下面这个问题,其中Duck是一个已知的类,并以多种方式指定对象的值: Duck d1(); Duck d2(d1); Duck d3 = d1; Duck d4; d4 = d1; 问题在于,上述d1.d2.d3.d4是如何创建的呢?分别调用的哪个函数呢? 1.赋值和初始化的区别 C++中,赋值和初始化是两个不同的概念: 初始化是指对象创建之时指定其初值,分为直接初始化和复制初始化两

  • C++基础知识之运算符重载详解

    目录 运算符重载 方式一,使用成员函数重载运算符需求:把牛肉换猪肉,羊肉换猪肉 方式二,使用非成员函数[友元函数]重载运算符 两种方式的区别 两种方式的选择: 总结 运算符重载 为什么要使用运算符重载 -C/C++的运算符,支持的数据类型,仅限于基本数据类型. 问题:一头牛+一头马 = ?(牛马神兽?) 一个圆 +一个圆 = ? (想要变成一个更大的圆)一头牛 – 一只羊 = ? (想要变成4只羊,原始的以物易物:1头牛价值5只羊) 解决方案: 使用运算符重载 方式一, 使用成员函数重载运算符

  • C++中的运算符和表达式

    目录 (1)算术表达式 (2)赋值运算符 (3)逗号运算符 (4)关系运算符 (5)三元表达式 (6)sizeof函数 (7)数据类型转换 (7.1)显式转换 (7.2)隐式转换 (8)总结 在编程语言中“表达式”可以近似于“公式”,也就是按照自己的预期进行某种计算,表达式由运算符合操作数等构成.C++中包含单目(一元)运算符.双目(二元)运算符和三目(三元)运算符,相应的构成了多种表达式.运算符具有优先级和结合性,优先级指先后计算次序,结合性指同级运算符时按照自左向右还是自右向左进行计算. (

  • JavaScript中instanceof运算符的用法总结

    JavaScript中instanceof运算符是返回一个 Boolean 值,指出对象是否是特定类的一个实例. 使用方法:result = object instanceof class其中result是必选项.任意变量.object是必选项.任意对象表达式.class是必选项.任意已定义的对象类. 说明如果 object 是 class 的一个实例,则 instanceof 运算符返回 true.如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false.

  • 浅谈JS中逗号运算符的用法

    注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScript做举例. 最近重新阅读JavaScript权威指南这本书,应该说很认真的阅读,于是便想把所学的东西多记录下来.后 面本人将逐步写上更多关于本书的文章. 本文的理论知识来自于JavaScript权威指南,我这里做一下整理,或者说叫笔记. 如果你的基础够好的话,完全理解不成问题,但是如果读得有些郁闷的话,可以加我的QQ:

  • C++编程中逗号运算符和条件运算符的使用方法讲解

    逗号运算符:, 允许对两个语句进行分组,其中有一个是预期的. expression , expression 备注 逗号运算符具有从左向右的关联性. 由逗号分隔的两个表达式将从左向右进行计算. 始终计算左操作数,并且在计算右操作数之前将完成所有副作用. 在某些上下文(如函数参数列表)中,逗号可用作分隔符. 不要将该逗号用作分隔符与将其用作运算符的情况混淆:这两种用法完全不同. 考虑表达式 e1 , e2 该表达式的类型和值是 e2 的类型和值:e1 的计算结果将被丢弃. 如果右操作数是左值,则结

  • 深入解析C++编程中的运算符重载

    C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.例如: class complex { public: complex(double r=0.0,double I=0.0){real=r;imag=I;} void display(); private: double real; double imag; }; complex a(10,20),b(5,8); "a+b"运算如何实现?这时候我们需要自己编写程序来说明"

  • javascript中in运算符用法分析

    本文实例讲述了javascript中in运算符用法.分享给大家供大家参考.具体分析如下: in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望他的右操作数是一个对象:如果右侧对象拥有一个名为左操作数值的属性名,那么表达式返回true: var point = {x:1,y:1}; "x" in point //true "z" in point //false "toString" in point //true var ary = [

  • JavaScript中的运算符种类及其规则介绍

    JavaScript中的运算符有很多,主要分为算术运算符,等同全同运算符,比较运算符,字符串运算符,逻辑运算符,赋值运算符等.这些运算符都有一些属于自己的运算规则,下面就为大家介绍一下JavaScript中的运算符. 一.JavaScript运算符的种类 1.算术运算符:+ . - .* . / . % . -(一元取反) . ++ . -- 2.等同全同运算符:== . ===. !== . !=== 3.比较运算符:< . > . <= . >= 4.字符串运算符:< .

  • C#编程自学之运算符和表达式

    我们了解完C#数据类型与变量之后,还会遇到变量之间的运算,例如计算两个数的和等等运算.那么,C#中都有那些常用的运算符呢?那么,往下看吧! 一.算数运算符 1.基本算数运算符 说到算数运算符,我们首先就应该可以想到我们数学中一些常用的运算符例如:加 减 乘 除 求余! 那么在C# 这些运算符都是如何表示的呢? 知道C#基本运算符的表示之后我们该如何去使用呢?那么我们来看段代码来看下什么是表达式. int a = 10; //定义一个整形变量a 值为10 int b = 20; //定义一个整形变

  • C++编程中new运算符的使用学习教程

    new运算符用作从自由存储为 type-name 的对象或对象数组分配内存,并将已适当分类的非零指针返回到对象. [::] new [placement] new-type-name [new-initializer] [::] new [placement] ( type-name ) [new-initializer] 备注 如果不成功,则 new 将返回零或引发异常:有关详细信息,请参阅 new 和 delete 运算符. 通过编写自定义异常处理例程并调用 _set_new_handler

  • C++中的运算符和运算符优先级总结

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C++ 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本文将逐一介绍算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和其他运算符. 算术运算符 下表显示了 C++ 支持的所有算术运算符. 假设变量 A 的值为 10,变量 B 的值为 20,则: 运算符 描述 实例 + 把两个操作数相加 A + B 将得到 30 - 从第一个操作数中减去第二个操作数 A - B 将

随机推荐