C++算术运算符与类型转换

目录
  • 1、算术运算符
  • 2、优先级
  • 3、类型转换
    • 初始化和赋值时的转换
    • 使用花括号进行转换
  • 4、表达式中转换
  • 5、强制类型转换

1、算术运算符

C++当中提供5种基础的算术运算符:加法减法乘法除法取模

我们来看下代码:

int a = 10, b = 3;

cout << a + b << endl;  // 13
cout << a - b << endl;  // 7
cout << a * b << endl;  // 30
cout << a / b << endl;  // 3
cout << a % b << endl;  // 1

前面三个都非常简单,着重讲下最后两种。

对于除法来说,我们要注意的是它是区分类型的。当我们的除数和被除数都是整数的时候,得到的结果也会是一个整数。所以10 ➗ 3得到的结果就是3,它的小数部分会被抛弃。想要得到小数结果,只需要除数或者被除数当中有一个是浮点型即可。

取模运算符求的就是一个数除以另外一个数之后的余数。这里要注意,在其他语言当中并没有对取模运算的限制,而在C++当中,严格限制了取模运算的对象只能是整数。

否则编译的时候会报错:

2、优先级

C++当中算术运算符的优先级和我们从小数学课本里是一样的,先乘除再加减。

如:

3 + 4 * 5; // 23
120 / 4 * 5; // 150
20 * 5 + 4 * 6; // 124

即当乘除法和加减法同时出现时,先算乘除后算加减。如果有多个运算符同样优先级,那么先左后右。

3、类型转换

前面说了,同样是除法,根据除数和被除数类型的不同,得到的结果也不同。这样固然非常灵活,但是除了更加复杂给学习、使用者带来负担之外,也会使得计算机的操作更加复杂。

比如我们一共有11种整型和3种浮点型,那么我们在计算的时候就会出现大量不同的情况。比如short + shortshort + intshort + double等等,那么编译器就需要对这么多种情况都进行处理,这显然是非常麻烦的。为了解决这个问题,C++会自动执行许多类型转换。

下面我们对这些情况进行一一讨论。

初始化和赋值时的转换

当我们对某个值进行初始化或者赋值的时候,C++会自动将赋予的值转化成接收者的类型。

比如:

float a = 3.5f;
double b = a;

在上面这个例子当中,我们将一个float类型的变量a赋值给了double类型的b。那么编译器会将a的值拓展成64位的double再赋值给b。也就是说不会影响b的类型。

这样将长度更短的变量转化成更长变量的类型转换除了多占用一点内存之外,不会导致什么问题。但反向操作可能就会出错,

比如:

long long a = 0x3f3f3f3f3f3f3f;
int b = a;

在上面的例子当中,我们将一个long long赋值给了int,由于a的数值非常大超过了int能够承载的范围,进行这样的赋值之后,编译器并不会报错(甚至不会有警告),但将会导致结果错误。b变量将不可能再和a变量相等。

再比如将float变量赋值给int的时候,同样也会有类似的问题,所以在进行赋值的时候,当两个变量的类型不同时,千万要当心。

使用花括号进行转换

这是C++ 11的新特性,使用大括号进行初始化,这种操作被称为列表初始化。

这种方式的好处和坏处都很明显,好处是它不允许变量长度缩窄的情况,坏处则是又增加了学习的成本。例如,不允许将浮点型转换成整型。在不同的整型之间以及整型转化成浮点型的操作可能被允许,取决于编译器知道目标变量能够正确地存储赋给它的值。比如可以将int类型赋值给long,因为long总是至少与int一样长,反向操作则会被禁止。

int a = 0x3f3f3f3f;
long b = {a};   // 允许

long a = 0x3f3f3f3f;
int b = {a};    // 禁止

关于列表初始化,C++ primer当中还列举了一个非常有意思的case

const int x = 55;
char c = {x};   // 允许

int x = 55;
char c = {x}; // 禁止

const int x = 1255;
char c = {x};   // 禁止

const int x = 1255;
char c = x;  // 允许会警告

这是为什么呢?因为我们加了const修饰之后,编译器就明确知道了x的值,就等于55,它在char类型的范围内,所以允许将它转化成char。如果不加const,那么在编译器看来x是一个int型的变量,它的范围要大于char,所以会禁止。即使我们加了const修饰,如果x的值过大,超过char的范围,也同样会被禁止。

4、表达式中转换

当一个表达式当中出现多个变量类型的时候,C++也会进行转换。由于可能涉及的情况非常多,使得这个转换的规则也会比较复杂。

表达式时C++会将boolcharunsigned charsigned charshort全部转换为int
对于bool类型来说,true会被转化成1,false转换成0,其他类型的转换应该都很好理解,都是将范围更小的变量转化成范围更大的int,这种转换称作整型提升。因为通常int类型都是计算机最自然的类型,也意味着计算机在处理int的时候,处理的速度最快。

将不同类型进行运算的时候,也会做一些转换。比如将intfloat相加的时候,由于涉及到两种类型,其中范围较小的那个会被转换成较大的类型。比如如果我们计算9.0 / 5,那么编译器会先将5转化成5.0,再进行除法运算,这样得到的结果自然也是一个double

C++11的规范中除了一个类型转换的校验表,我们可以参考一下校验表理解一下类型转换的过程。

  • 如果有一个数类型是long double,则将另外一个数也转成long double
  • 否则,如果有一个数类型是double,则将另外一个数也转成double
  • 否则,如果有一个数类型是float,则将另外一个数也转成float
  • 否则说明所有操作数都是整数,执行整型提升

5、强制类型转换

C++当中允许开发者手动强制对变量的类型进行转换,这也是C++的设计思路,规则严谨,但也允许推翻规则追求灵活度。

强制类型转换的方式有两种写法:

int a;
(long) a;
long (a);

这两行代码都是将一个int型的a转换成long型的,上面的是C语言的写法,底下一行是C++的写法。

还有一点要注意就是转换的顺序,我们来看一个例子:

int a = 11.99 + 19.99;
cout << a << endl;
int b = int(11.99) + int(19.99);
cout << b << endl;

在这段代码当中a和b输出的结果是不同的,a输出的结果是31,而b是30。

这是因为第一行代码是先计算的加法,得到31.98,再通过类型转换将31.98转换成int。对于浮点数向整型的转换,C++会直接抹掉小数部分,所以得到的结果是31。而第二行代码当中,我们是先进行的类型转换,11.99和19.99分别被转换成了11和19,相加得到的结果也就是30了。

这里的一点差别很多新人经常踩坑,千万注意。

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

(0)

相关推荐

  • C++运算符重载图文详解

    目录 1. 运算符重载 1.1 运算符重载为普通函数 1.2 运算符重载为成员函数 2. 赋值运算符=的重载 2.1浅复制与深复制 2.2返回值的讨论 3. 动态可变长度数组 总结 1. 运算符重载 C++的运算符只能用于基本的数据类型 表达形式 返回值类型 operator 运算符 (形参表) { ... } 1.1 运算符重载为普通函数 1.2 运算符重载为成员函数 2. 赋值运算符=的重载 当赋值运算符两边的类型不匹配,比如int类型赋值给Complex类型,在这种情况下,就需要重载赋值运

  • C++类与对象之运算符重载详解

    目录 运算符重载 加号运算符重载 左移运算符重载 递增运算符重载 递减运算符重载 赋值运算符重载 关系运算符重载 函数调用运算符重载 总结 运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 加号运算符重载 作用:实现两个自定义数据类型相加的运算 #include <iostream> using namespace std; class Person { public: // 构造函数 Person(int num1, int num2){ thi

  • C++运算符重载的详细讲解

    加号运算符重载 对于内置数据类型,编译器知道如何运算 但是对于自己封装的类,编译器无法进行运算 这时可以通过自己定义运算符重载进行运算 operator+ 通过成员函数重载+号 #include<iostream> using namespace std; class Person { public: int m_a; int m_b; //通过成员函数实现重载 Person operator+ (Person &p) { //创建一个临时变量 Person temp; temp.m_

  • C++基础入门之运算符

    目录 1. 算术运算符 2. 赋值运算符 3. 比较运算符 4. 逻辑运算符 总结 1. 算术运算符 2. 赋值运算符 3. 比较运算符 4. 逻辑运算符 总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

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

    实际上,很多C++运算符已经被重载.eg:将*运算符用于地址,将得到存储在这个地址中的值,将他用于2个数字时,得到的将是他们的乘积.C++根据操作数的数目和类型来决定采用哪种操作. C++允许将运算符重载扩展到用户定义的类型.例如,允许使用+将两个对象相加.编译器将根据操作数的数目和类型决定使用加法定义.运算符重载可以使代码看起来更自然.例如,将2个数组相加是一种常见的运算.通常,需要使用下面这样的for循环来实现: 复制代码 代码如下: for (int i = 0; i < 20; i++)

  • C++类型转换运算符详解

    目录 老式显式类型转换 c++的显示类型转换 为什么要有新的类型转换 具体应该使用哪种转换 static_cast运算符 dynamic_cast运算符 const_cast运算符 reinterpret_cast运算符 老式显式类型转换实际的转换方式 总结 老式显式类型转换 (类型)表达式 c风格的强制类型转换 类型(表达式) 函数式的强制类型转换 1,最开始使用的是c风格的类型转换,但是为了能够使类型转换看起来更像是一个函数调用,因此引入了函数式的类型转换.函数式的类型转换能够像使用一个函数

  • C++算术运算符与类型转换

    目录 1.算术运算符 2.优先级 3.类型转换 初始化和赋值时的转换 使用花括号进行转换 4.表达式中转换 5.强制类型转换 1.算术运算符 C++当中提供5种基础的算术运算符:加法.减法.乘法.除法和取模. 我们来看下代码: int a = 10, b = 3; cout << a + b << endl; // 13 cout << a - b << endl; // 7 cout << a * b << endl; // 30

  • C++学习之算术运算符使用详解

    目录 1. 前言 2. 运算符种类 3. 算术运算符 3.1 功能描述 3.2 运算符重载问题 3.3 两数相除的问题 3.4 关 于/和%运算符的正.负问题 3.5 数据溢出问题 3.6 类型转换 3.7 {}赋值语法 3.8 强制类型转换 3.9 auto 语法 4. 总结 1. 前言 编写程序时,数据确定后,就需要为数据提供相应的处理逻辑(方案或算法).所谓逻辑有2种存在形态: 抽象形态:存在于意识形态,强调思考过程,与具体的编程语言无关. 具体形态:通过代码来实现.需要使用表达式描述完整

  • Lua中算术运算符的使用示例

    下表列出了所有的Lua语言支持的算术运算符.假设变量A持有10和变量B持有20,则:  例子 试试下面的例子就明白了所有的Lua编程语言提供了算术运算符: 复制代码 代码如下: a = 21 b = 10 c = a + b print("Line 1 - Value of c is ", c ) c = a - b print("Line 2 - Value of c is ", c ) c = a * b print("Line 3 - Value o

  • Python算术运算符实例详解

    Python算术运算符 以下假设变量a为10,变量b为20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200 / 除 - x除以y b / a 输出结果 2 % 取模 - 返回除法的余数 b % a 输出结果 0 ** 幂 - 返回x的y次幂 a**b 输出结果 20 // 取整除 - 返回商的整数部分 9//2

  • python入门教程之基本算术运算符

    一.算术运算符 运算符 + - * / % **(幂)求次方 //(取整除,向下取整)如:9//2 =4 二.比较运算符 运算符 == != <>(不等于,类似!=) < > >= <= #举例说明: x = 10 y = 20 print(x > y) # False print(x < y) # True print(x >= y) # False print(x <= y) # True print(x == y) # False prin

  • 一篇文章带你入门java算术运算符(加减乘除余,字符连接)

    目录 概念 实例 注意点 1.除法不能整除时 2.类型的提升 3.字符的(+)操作 4.字符串的(+)操作 实例1 实例2 实例3 实例4 总结 概念 算术运算符用在数学表达式中,它们的作用和在数学中的作用一样. 运算符 描述 实例 + 加法 - 相加运算符两侧的值 20+10=30 - 减法 - 左操作数减去右操作数 20-10=10 * 乘法 - 相乘操作符两侧的值 20*10=200 / 除法 - 左操作数除以右操作数 20/10=2 % 取余 - 左操作数除以右操作数的余数 20%10=

  • python小例子-缩进式编码+算术运算符+定义与赋值

    目录 一.​缩进式编码 二.算术运算符 三.定义与赋值 以Python 3.x版本为主 一.​缩进式编码 解释型:没有编译环节,直接运行执行代码显示效果 ​缩进式编码风格:​ 代码块不使用大括号{}包含类.函数逻辑判断代码 ​逻辑判断:​ a='你好' b='51CTO' f=True if f: c=a+','+b print (c) else: c=a+b print (c) ​效果如下:​ 二.算术运算符 特点:易于学习.阅读.维护.跨平台.可扩展等 ​运算符​ 编号 算术运算符 符号 1

  • Python3中的算术运算符详解

    目录 一·算术运算符 二·代码演示 1·求和 + 2·取差 - 3·相乘 * 4·相除 / 5·取余 % 6·幂运算 ** 7·整除 // 8·优先级混合运算 三·'+'与'*'在序列中的使用 1·拼接合并 + 2·复制 * 一·算术运算符 在python中,算术运算符与数学中的算术运算极为类似,只是有些运算符号有所差别.算术运算符的算术计算一般是运用于int类型与floa类型,同时+与*还可以运用到各种序列的拼接合并与复制中. 优先级:有括号先算括号内的,再乘方>乘除>整除>取余>

  • c语言算术运算符越界问题解决方案

    大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数. 作为一个系统程序员, 有必要对这些细节有深入的了解. 本篇参考csapp, 主要介绍如何判断算术运算的越界问题. (虽然本篇的代码经过大量的测试, 但本人仍然无法保证代码的正确性, 希望大家纠错). 讲解的原则是"摆定理, 不证明, 写代码". 具体的证明过程在csapp中有详细的讲解, 也不是太难. 主要使用关键

  • C++隐式类型转换运算符operator type()用法详解

    在阅读<<C++标准库>>的时候,在for_each()章节遇到下面代码, #include "algostuff.hpp" class MeanValue{ private: long num; long sum; public: MeanValue():num(0),sum(0){ } void operator() (int elem){ num++; sum += elem; } operator double(){ return static_cast

随机推荐