C++学习(七)入门篇——C++算数运算符
以下介绍5种C++基本运算符
+、-、×、/、%
注意/为第一个数除以第二个数,结果为商的整数部分,小数部分被丢弃
%求模,两个操作数必须是整型,它生成第一个数除以第二个数的余数
如果其中一个是负数,那么结果的符号满足:(a/b)*b+a%b=a
程序清单3. arith.cpp
//arith.cpp - - some C++ arithmetic
#include<iostream>
int main()
{
using namespace std;
float hats, heads; cout.setf(ios_base::fixed, ios_base::floatfield);
cout << "Enter a number: ";
cin >> hats;
cout << "Enter another number:";
cin >> heads;
cin.get(); cout << "hats = " << hats << ";heads = " << heads << endl;
cout << "hats + heads = " << hats + heads << endl;
cout << "hats - heads = " << hats - heads << endl;
cout << "hats * heads = " << hats * heads << endl;
cout << "hats / heads = " << hats / heads << endl;
cin.get();
}
得到输出:
11.17+50.25=61.42,输出为61.41998,这不是运算问题,而是float表示有效位数能力有限。
它只保证6位有效位,四舍五入成6位就是61.4200是对的,cout打印6个小数,使用double能保证更好的精度。
1.运算符优先级和结合性
先乘除后加减,也可以用括号来执行自己定义的优先级
而×、/、%优先级相同,这个时候需要考虑结合性,可去附录D查看
如float logs=120/4*5;
乘除都是从左到右的,所以结果为150
仅当两个运算符被用于同一操作数时,优先级和结合性规则才有效
如int dues=20*5+24*6;
程序清单3. divide.cpp
//divide.cpp - - integer and floating-point division
#include<iostream>
int main()
{
using namespace std;
cout.setf(ios_base::fixed, ios_base::floatfield);
cout << "Integer division: 9/5 = " << / << endl;
cout << "Floating-point division: 9.0/5.0 = " << 9.0 / 5.0 << endl;
cout << "Mixed division: 9.0/5 = " << 9.0 / << endl;
cout << "double constants: 1e7/9.0 = " << 1e7f / 9.0 << endl; //1.e7f也可以
cout << "float constants: 1e7f/9.0f = " << 1e7f/ 9.0f << endl;
cin.get();
}
浮点常量在默认情况下为double类型,两操作数为float则结果为float,一个double,一个float也为double
运算符重载是什么意思?
比如你定义一个类型“学生”
现在如果你把两个“学生”类型的变量相加, 那系统怎么知道你要怎么加? 如果是数字的话,系统知道。
那这个时候,你就要为“学生”这个类型重载加号运算符
然后在这个重载的方法里实现相加的意义,比如“学生”类型的年龄相加,或是其它东西相加,这个就你自己定义了
2.求模运算符
它返回整数除法的余数,适用于解决要求将一个量分成不同整数单元的问题
程序清单3. modulus.cpp
//modulus.cpp - - uses % operator to convert lbs to stone
#include<iostream>
int main()
{
using namespace std;
const int Lbs_per_stn = ;
int lbs; cout << "Enter your weight in pounds:";
cin >> lbs;
cin.get();
int stone = lbs / Lbs_per_stn;
int pounds = lbs%Lbs_per_stn;
cout << lbs << " pounds are " << stone << " stone," << pounds << " pounds\n";
cin.get(); }
得到结果:
3.类型转换
C++允许将一种类型的值赋给另一个类型的变量
so_long = thirty;
程序将thirty的值扩展为long,扩展后得到一个新值,被存储在so_long中,而thirty内容不变。值不会改变,只是占用更多的字节。
将较大的浮点类型转换为较小的浮点类型,如将double转换为float | 精度(有效位数)降低,值可能超出目标类型的取值范围,在这种情况下,结果将是不确定的 |
将浮点类型转换为整型 | 小数部分丢失,原来的值可能超出目标类型的取值范围,在这种情况下,结果将是不确定的 |
将较大的整型转换为较小的整型,如将long转换为short | 原来的值可能超出目标类型的取值范围,通常只复制右边的字节 |
像一个long值,(如2111222333)赋给float精度将下降,float只有6位有效数字,四舍五入为2.11122E9
将浮点转化为整型会将数字截短,其次float相对于int太大了,float至少32位,int至少16位。
程序清单3. assign.cpp
//init.cpp - - type changes on initialization
#include<iostream>
int main()
{
using namespace std;
cout.setf(ios_base::fixed, ios_base::floatfield);
float tree = ;
int guess(3.9832);
int debt = 7.2E12;
cout << "tree = " << tree << endl;
cout << "guess = " << guess << endl;
cout << "debt = " << debt << endl;
cin.get(); }
得到输出:
int变量无法存储3.0E12,导致C++没有对结果进行定义的情况发生。
使用大括号的初始化称为列表初始化,给复杂的数据类型提供值列表。它对类型的转换要求更加严格,列表初始化不允许缩窄。即变量的类型无法表示赋给它的值。
条件是编译器知道目标变量能够正确的存储赋给它的值。
const int code=66;
int x =66;
char c1 {31325}; 缩窄
char c2 = {66};
char c3 = {code};
char c4 = {x}; x是一个变量,编译器不会跟踪从x被初始化到它被用来初始化c4
x=31325;
char c5 = x; 允许
自动转换:
在计算表达式时,C++将bool、char、unsigned char和short值转换为int叫做整型提升,当运算涉及两种类型时,较小的类型被转化为较大的类型。
(1)如果有一个操作数类型为long double,则将另一个转换为long double
(2)否则,有一个类型为double,则将另一个转化为double
(3)否则,一个类型为float,则另一个为float
(4)否则,操作数都是整型,因此执行整型提升
(5)如果两操作数都是有符号或无符号的,且其中一个操作数比另一个低,则转换为高的级别
(6)如果一个有符号,一个无符号,无符号操作数比有符号的高,则将有符号转化为无符号的类型
(7)如果有符号类型可表示无符号的所有可能取值,则将无符号转化为有符号操作数所属类型
(8)否则,将两个操作数都转化为有符号类型的无符号版本
有符号整型按级别从高到底:long long、long、int、short和signed char。无符号整型和有符号整型排列顺序相同。类型char、signed char和unsigned char相同,类型bool级别最低,wchar_t、char16_t、char32_t级别和底层类型相同。
强制类型转化(将thorn中的int值转化为long类型)
(long) thorn
long (thorn)
强制类型通用格式
(typeName) value
typeName (value)
第一种格式来自C语言,第二种格式是C++,就像是函数调用。
C++还引入了四个强制类型转换符,static cast<>通用格式
static_cast<typeName> (value)
程序清单3. typecast.cpp
//typecast.cpp - - forcing type changes
#include<iostream>
int main()
{
using namespace std;
int auks, bats, coots; auks = 19.99 + 11.99; bats = (int)19.99 + (int)11.99;
coots = int(19.99) + int(11.99);
cout << "auks = " << auks << ",bats = " << bats;
cout << ",coots = " << coots << endl; char ch = 'Z';
cout << "The code for " << ch << "is ";
cout << int(ch) << endl;
cout << "Yes,the code is ";
cout << static_cast<int>(ch) << endl;
cin.get();
}
结果:
auto这个新工具能够根据初始值的类型来推断变量的类型
auto n=100; int
auto x=1.5; double
auto y=1.3e12L; long double
但也会导致问题
如要把x、y、z指定为double类型
auto x=0.0;
double y=0;
auto z=0; 可知z是int类型
C++学习(七)入门篇——C++算数运算符的更多相关文章
- PHP学习笔记 - 入门篇(4)
PHP学习笔记 - 入门篇(4) 什么是运算符 PHP运算符一般分为算术运算符.赋值运算符.比较运算符.三元运算符.逻辑运算符.字符串连接运算符.错误控制运算符. PHP中的算术运算符 算术运算符主要 ...
- PHP学习笔记 - 入门篇(3)
PHP学习笔记 - 入门篇(3) 常量 什么是常量 什么是常量?常量可以理解为值不变的量(如圆周率):或者是常量值被定义后,在脚本的其他任何地方都不可以被改变.PHP中的常量分为自定义常量和系统常量 ...
- PHP学习笔记 - 入门篇(5)
PHP学习笔记 - 入门篇(5) 语言结构语句 顺序结构 eg: <?php $shoesPrice = 49; //鞋子单价 $shoesNum = 1; //鞋子数量 $shoesMoney ...
- PHP学习笔记--入门篇
PHP学习笔记--入门篇 一.Echo语句 1.格式 echo是PHP中的输出语句,可以把字符串输出(字符串用双引号括起来) 如下代码 <?php echo "Hello world! ...
- netty深入学习之一: 入门篇
netty深入学习之一: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java NI ...
- Java工程师学习指南 入门篇
Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...
- Elasticsearch学习记录(入门篇)
Elasticsearch学习记录(入门篇) 1. Elasticsearch的请求与结果 请求结构 curl -X<VERB> '<PROTOCOL>://<HOST& ...
- PHP学习笔记 - 入门篇(2)
PHP入门篇(2) 什么是变量 变量是用于存储值的容器,如下 $var = @"6666" 如何定义变量 定义变量就是像服务器的内存申请空间,用来存储数据,eg: <?php ...
- RabbitMq学习一入门篇(hello world)
简介 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java,也是众多消息队列中表现不俗的一员,作用就是提高系统的并发 ...
随机推荐
- memcached配置
首先是安装libevent库,执行如下的命令 tar vzxf libevent-2.0.21-stable.tar.gz cd libevent-2.0.21-stable ./configure ...
- 一些JQuery使用技巧
最近做项目,在使用JQuery中遇到一些问题记录下. 1.根据Id查询父级内容,或者父级的父级 之前会使用$("#id").parent().parent(): 这种使用有很大的弊 ...
- [0] MVC&MVP&MVVM差异点
MVC: 用户的请求首先会到达Controller,由Controller从Model获取数据,选择合适的View,把处理结果呈现到View上: MVP: 用户的请求首先会到达View,View传递请 ...
- ClassLoader机制:一个类何时会被虚拟机初始化?
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 大家都知道Java程序被编译器编译成字节码文件保存在硬盘里,Java虚拟机在执行代码时首先要把编译后的字节码文件从硬盘加载到内存中,然后才 ...
- 就是要你懂Java中volatile关键字实现原理
原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是j ...
- Java学习笔记--反射API
反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换. 按照 一般地面向对象的设计 ...
- Image和字节数组互转
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; ...
- Linux10分钟入门
最近打算考红帽认证,将自己学习到的和工作中常用的一些命令进行总结,供初学者和一定基础的参考. 想系统性学习的话,还是建议看书(鸟哥的Linux私房菜)和看视频(基础版,推荐马哥和老男孩,不推荐**** ...
- Linux之虚拟机网络配置
一般安装完虚拟机后,VMware会为虚拟机在网络连接配置为“NAT模式(N):用于共享主机的IP地址”. 这种模式下虚拟机会共享主机的网络环境,主机可以访问外网那么虚拟机可以,主机可以(哪怕是拨VPN ...
- php七牛批量删除空间内的所有文件方法
相信大家都在使用七牛的免费云存储服务的同时,有清空七牛云存储镜像文件或者批量删除七牛云空间文件的需求,该怎么做?官方的工具好像并没有提供批量删除的功能,七牛云官方给出的建议是删除空间,再新建一个这样太 ...