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++基础语法,基础算法与数据结构的相关内容。本文为浮点类型,布尔类型,隐式与显示转换,字符类型的基本使用,以及相关案例练习。

相关文章
|
22天前
|
Java API C++
Java JNI开发时常用数据类型与C++中数据类型转换
Java JNI开发时常用数据类型与C++中数据类型转换
36 0
|
3天前
|
安全 C++
C++一分钟之-互斥锁与条件变量
【6月更文挑战第26天】在C++并发编程中,`std::mutex`提供互斥访问,防止数据竞争,而`std::condition_variable`用于线程间的同步协调。通过`lock_guard`和`unique_lock`防止忘记解锁,避免死锁。条件变量需配合锁使用,确保在正确条件下唤醒线程,注意虚假唤醒和无条件通知。生产者-消费者模型展示了它们的应用。正确使用这些工具能解决同步问题,提升并发性能和可靠性。
16 4
|
11天前
|
存储 C++ 容器
C++一分钟之-变量与数据类型入门
【6月更文挑战第18天】**C++编程基础:变量与数据类型概览** 了解变量(存储数据的容器)和数据类型是编程入门的关键。声明变量如`int age = 25;`,注意初始化和类型匹配。基本数据类型包括整型(int等)、浮点型(float、double)、字符型(char)和布尔型(bool)。理解类型范围和精度,使用字面量后缀增强可读性。深入学习数组、指针、结构体和类,以及动态内存管理,避免数组越界和内存泄漏。不断实践以巩固理论知识。
20 1
|
11天前
|
数据安全/隐私保护 C++
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
|
1天前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
4 0
|
2天前
|
C语言 C++
技术经验分享:c++中的数据类型转换
技术经验分享:c++中的数据类型转换
|
3天前
|
C++
C++数据类型
C++数据类型
7 0
|
3天前
|
C++
C++之变量与常量
C++之变量与常量
4 0
|
1月前
|
存储 安全 编译器
c++变量类型
c++变量类型
23 1
|
23小时前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。