C++003-C++变量和数据类型2

简介: C++003-C++变量和数据类型2

C++003-C++变量和数据类型2



C++数据类型


数据类型及定义

2e0813b086684dd7a188b1b11e1a3cb8_8c2e7bab781a4147bf2fde316b1435a7.png


数据类型及类型大小

1.unsigned 不影响变量存储的大小,仅影响变量取值的范围

2.指针的大小位寻址空间大小N位编译器的寻址空间大小=2 的N次方

6202ca467f8a767933b3f72da0782246_1a039db350494ad3b7f7ebac0a47fc82.png


d7ce8a7c1c0dc54d2178b9bd335d53a6_b17df14802134675a6393bec2469f847.png

f6fb86a9cd29b67432131586b0b2cdae_1b40a75becbc4be295fb2bef48091698.png

4fb04e08c859580ec1c007a41a025e61_c1e7b6c6c231404db1ee85099caec3fe.png

3b5f83d118a22f0b95e396d69801cd8d_b1ddddac148f44f0933f66fae1500b84.png

10166095a65310141e6039309ca52225_a47615289d82441ea61b44343a9f4ed9.png


浮点数据的使用

e92adfc3bba85387784c0d5176003e93_56ff8dd283314f09aa6d6deac3e60adc.png


#include <iostream>
using namespace std;
int main()
{
    //类型一:整数位很多
    double x=12345678;
    //类型二:小数位很多,有效小数位少
    double y=0.00005678;
    //类型三:小数位很多,有效小数位也多
    double z=1.1234567;
    cout<<x<<endl;
    cout<<y<<endl;
    cout<<z<<endl;
    // 前两个数采用了科学记数法(scientific notation),第三个数保留了5位小数。
    cout<<"$$$$$$$$$$$$$$$"<<endl;
    return 0;
}

输出为:


1.23457e+07

5.678e-05

1.12346

$$$


前两个数采用了科学记数法(scientific notation),第三个数保留了5位小数。浮点数用默认记数法defaultfloat编写:这种表示方法尽可能用多的位数,这个位数包括小数点前及小数点后的位数。

默认记数法特点


1)保留有效位至多6位(有效位包括小数点前的位数,正如上文译文提到的),如 double z=1.1234567;的输出为1.12346。截取数字的规则是四舍五入

2)删去无效位数(也算是第一点的进一步说明)

double x=1.234596;

cout<<x<<endl;

的输出为1.2346,而不是1.23460

3)适当情况下会用科学记数法(scientific notation)

//类型一:整数位很多

double x=12345678;

//类型二:小数位很多,有效小数位少

double y=0.00005678;


题目描述:求阴影面积


49915b89a4477ed35c87c20e35c80170_d70baca1a1714c02bdd92b446d339b4c.png


4dc9b466a6dc41b908e818d5e7d3f9a3_536e2cfc95c948ceb72d2ced0b23cb8f.png

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    double m,n,S,S1,S2;
    cout<<"请输入两个正方形的边长m和n,用空格或换行分割"<<endl;
    cin>>m>>n;
    S1 = 0.5*m*m;//
    S2=0.5*(n-m)*n;
    S = S1+S2;
    cout<<"阴影面积为:"<<fixed<<setprecision(2)<<S<<endl;
    return 0;
}

输出为:


请输入两个正方形的边长m和n,用空格或换行分割
10 5
阴影面积为:37.50
Process returned 0 (0x0)   execution time : 4.613 s
Press any key to continue.

题目描述:计算园的周长和面积


3562937aab29a4fb0bbdd53b3f477a7e_0cc4a3d63c5d40f5b74e1df3328910a6.png

//#include <iostream>
//#include <iomanip>
//#include<cmath>
//#include <limits>
#include<bits/stdc++.h>
using namespace std;
int main()
{
    /*
    const long double pi = acos(-1.L);
    std::cout << "default precision (6): " << pi << '\n'
              << "std::setprecision(10): " << std::setprecision(10) << pi << '\n'
              << "max precision:         "
              << std::setprecision(std::numeric_limits<long double>::digits10 + 1)
              << pi << '\n';
    */
    /*
    default precision (6): 3.14159
    std::setprecision(10): 3.141592654
    max precision:         3.141592653589793239
    */
    double pi = 3.14;
    double r,C,S;
    cout<<"输入半径的长度"<<endl;
    cin>>r;
    C = 2*pi*r;
    S = pi*r*r;
    cout<<"园的周长为:"<<C<<endl; // 62.83185307179586232
    cout<<"园的面积为:"<<S<<endl; // 314.1592653589793258
    //cout<<"园的周长为:"<<std::setprecision(2)<<C<<endl; //63
    //cout<<"园的面积为:"<<S<<endl; // 3.1e+02
    //cout<<"园的周长为:"<<fixed<<C<<endl; //62.83
    //cout<<"园的面积为:"<<S<<endl; //314.16
    return 0;
}

输出为:


输入半径的长度
5.67
园的周长为:35.6076
园的面积为:100.948

如何取消科学计数法表示浮点数

用fixed,一个manipulator。

fixed


fixed是一个计算机专业术语,指向托管变量的指针并在 statement 执行期间“钉住”该变量。

fixed流操作符,它表示浮点输出应该以固定点或小数点表示法显示


#include <iostream>
using namespace std;
int main()
{
    //类型一:整数位很多
    double x=123456789;
    //类型二:小数位很多,有效小数位少
    double y=0.000056789;
    cout<<fixed<<x<<endl;
    cout<<fixed<<y<<endl;
    // 其实只要出现了fixed,则后面都是以fixed输出。第2行fixed不需要写了
    return 0;
}

输出为:


123456789.000000

0.000057


其实只要出现了fixed,则后面都是以fixed输出。第2行fixed不需要写了。

当 std::setprecision和std::ios::fixed一起使用时,则精度特指小数点后面保留的位数(注意和前面的区别,前面是包括小数点前面后面所有数字位数),如:上例中的 std::setprecision(10) << pi,则输出3.1415926536,不算小数点,小数点后面数字有10位


cout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2);

setiosflags 是包含在命名空间iomanip中的C++ 操作符,该操作符的作用是执行由有参数指定区域内的动作;

ios::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧;

ios::right 也是setiosflags 的参数,该参数的指定作用是在指定区域内右对齐输出;

setprecision 也是包含在命名空间iomanip 中的C++ 操作符,该操作符的作用是设定浮点数; setprecision(2) 的意思就是小数点输出的精度,即是小数点右面的数字的个数为2。

使用 setprecision(n) 可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。

如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。

setiosflags(ios::fixed)是用定点方式表示实数


所以:

cout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2);


合在一起的意思就是,输出一个右对齐的小数点后两位的浮点数。


iomanip的作用比较多:

主要是对cin,cout之类的一些操纵运算子,比如setfill, setw, setbase, setprecision等等。它是I/O流控制头文件, 就像C里面的格式化输出一样。以下是一些常见的控制函数的:


dec 置基数为10 相当于"%d"

hex 置基数为16 相当于"%X"

oct 置基数为8 相当于"%o"

setfill(c) 设填充字符为c

setprecision (n) 设显示小数精度为n位

setw (n) 设域宽为n个字符,这个控制符的意思是保证输出宽度为n。如:

cout << setw(3) << 1 << setw(3) << 10 << setw(3) << 100;

输出结果为

1 10100 (默认是右对齐)当输出长度大于3时(<<1000),setw(3)不起作用。


另外:


setioflags(ios::fixed) 固定的浮点显示

setioflags(ios::scientific) 指数表示

setiosflags(ios::left) 左对齐

setiosflags(ios::right) 右对齐

setiosflags(ios::skipws) 忽略前导空白

setiosflags(ios::uppercase) 16进制数大写输出

setiosflags(ios::lowercase) 16进制小写输出

setiosflags(ios::showpoint) 强制显示小数点

setiosflags(ios::showpos) 强制显示符号


#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    cout<<12345.1234568 <<endl;         // 输出"12345.1"
    cout << setprecision(3) << 10.1234568  << endl;
    // 输出"10.1"
    cout << setprecision(3) << 12345.1234568 << endl;
    //输出"1.23e+004 "
    cout << setiosflags(ios::fixed) << setprecision(3) <<12345.1234568  << endl;
    //输出"12345.123 "
    cout <<setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2)<< 10.2345 << endl;
    //输出"10.23 "
    cout <<setw(8)<< setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2)<< 10.2345 << endl;
    //输出"    10.23 "
    cout <<setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2)<< 10.2345 << endl;
    //输出"10.23 "
    return 0;
}

布尔变量的使用

2d11d3b3a3f888bac9a39252a11037e8_d7c24db8eb37493c81bf710299e30854.png


隐式转换与显式转换

题目描述:计算球的体积


80c6f08924c74927dc8de5dd6078ffc1_e1bf6624b59d41178365f7c1f1cfb440.png

#include <iostream>
using namespace std;
int main()
{
    double pi = 3.14;
    double r,V;
    cout<<"输入半径的长度"<<endl;
    cin>>r;
    //V = 4/3*3.14*r*r*r; //3.14
    V = 4.0/3*3.14*r*r*r; //4.18667
    cout<<"园的体积为:"<<fixed<<V<<endl; //62.83
    return 0;
}

输出为:


输入半径的长度
1
园的体积为:3.140000
Process returned 0 (0x0)   execution time : 4.491 s
Press any key to continue.

上面的题中,发现4/3和4.0/3时的计算结果不一致,这里就出现了隐式转换的问题。


隐式转换规则:

C++语言编译系统提供的内部数据类型的隐式自动转换规则如下:

1、执行算术运算时,低类型(短字节)可以转换为高类型(长字节);例如: int型转换成double型,char型转换成int型等等;

2、赋值表达式中,等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它;

3、函数调用时,将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参;

4、函数有返回值时,系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,然后再赋值给调用函数返回;


显式强制类型转换C风格

在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型。其中数值型包括 整型与浮点型;字符型即为char。

(1)将浮点型数据赋值给整型变量时,舍弃其小数部分。

(2)将整型数据赋值给浮点型变量时,数值不变,但是以指数形式存储。

(3)将double型数据赋值给float型变量时,注意数值范围溢出。

(4)字符型数据可以赋值给整型变量,此时存入的是字符的ASCII码。

(5)将一个int,short或long型数据赋值给一个char型变量,只将低8位原封不动的送到char型变量中。

(6)将有符号型数据赋值给长度相同的无符号型变量,连同原来的符号位一起传送。


显式强制类型转换C++风格

C++中强制类型转换函数有4个:

const_cast(用于去除const属性),

static_cast(用于基本类型的强制转换),

dynamic_cast(用于多态类型之间的类型转换),

reinterpreter_cast(用于不同类型之间的指针之间的转换,最常用的就是不同类型之间函数指针的转换)。


参考:C++强制类型转换


#include <iostream>
using namespace std;
int main()
{
    int a = 10;
    int b = 3;
    double result = (double)a / (double)b;
    cout<<result<<endl;
    // 使用 static_cast 关键字
    int a1 = 10;
    int b1 = 3;
    double result1 = static_cast<double>(a1) / static_cast<double>(b1);
    cout<<result1<<endl;
    return 0;
}

输出为:

7ca2f4e1d1eb9a7b962dbd42cbb89861_b9fd3bff6305455f8e48ef5d05d7b9d7.png


字符数据的使用

C和C++中字符型变量只占用一个字节;

字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII码放入到存储单元。


#include <iostream>
using namespace std;
int main(){
    char ch = 'a';//要用单引号,且只能有一个字符
    cout << ch << endl;
    cout << sizeof(char) << endl;//查看字符型变量所占内存大小
    cout << (int)ch << endl;//字符型变量对应的ASCII码
    //system("pause");
    cout <<"$$$$$$$$$$$$$$"<<endl;
    //char s1;
    //cin >>s1; // 不能输入空格和换行符
    //cout <<s1 ;
    cout <<"$$$$$$$$$$$$$$"<<endl;
    char s2;
    s2 = getchar(); // 能输入空格32和换行符10
    cout << s2 <<int(s2) ;
    return 0;
}

ASCII码

74d05c4518c7570c8b41a14bd0e6153d_8e8559fa864342dab46771a65bc79906.png


课堂练习


题目描述 字符与整数运行

e36639bd119ebc6c43396332e88b9e72_42b28197c22a4f1eaf64dc9794b11700.png

#include <iostream>
using namespace std;
int main(){
    char a,b;
    cin >>a; //输入A 
    cout<<"a+1 = "<<a+1<<endl; //输出a+=66
    b = a+1; //赋值,并转换为char类型
    cout<<"b = "<<b<<endl; //输出b=B
    return 0;
}

题目描述 字符大写转小写

62a246b87afa0a8e453d915d6d9c4914_fdfb20b2df96496296b469c546dede83.png

#include <iostream>
using namespace std;
int main(){
    char a;
    cin >>a; //输入A
    cout<<char(a+32)<<endl; //输出a
    return 0;
}

题目描述 SOS


cea3e88c51b70eeaaafe7aff41e51da5_7c5a7cf6b57b4f88a9165d46bc687d3f.png

#include <iostream>
using namespace std;
int main(){
    char a,b,c;
    cin >>a>>b>>c; //输入A
    a = a-3;
    b = b-3;
    c = c-3;
    cout<<a<<b<<c<<endl; //输出a
    return 0;
}

9342f9a73ddd20ed90031fea21bbe42b_ded36b57015b436c950fd5a4ff3bd916.png


总结


本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为浮点类型,布尔类型,隐式与显示转换,字符类型的基本使用,以及相关案例练习。

相关文章
|
3月前
|
存储 Linux C语言
【C++基础】数据类型详解
这篇文章详细介绍了C++中各种基本数据类型,包括整型、浮点型、字符型、字符串型和布尔型,以及它们的使用方式和范围。
35 4
|
2月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
26 0
|
4月前
|
C++
c++学习笔记01 基本知识与数据类型
C++学习笔记,涵盖了C++中的常量定义、数据类型、变量内存大小计算、基本数据类型(整型、实型、字符型、字符串型、布尔型)以及转义字符的使用。
48 4
|
4月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
39 1
|
3月前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
96 0
|
5月前
|
存储 编译器 C++
|
6月前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
49 0
|
6月前
|
C语言 C++
技术经验分享:c++中的数据类型转换
技术经验分享:c++中的数据类型转换
32 0
|
24天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
83 5