三、基本數據類型和計算(一) 1、常量和變數 1)常量和變數定義 常量 值不會改變 變數 值可能改變 2)常量及變數名起名必須遵守的規則 1 不能重名 2 不能和C/C++語言里的關鍵字重名 3 必須是字母或者字母和數字的組合,符號僅_可以使用 4 名字不能用數字開頭 3)起名字建議遵守的規則 1 ...
三、基本數據類型和計算(一)
1、常量和變數
1)常量和變數定義
常量 | 值不會改變 |
---|---|
變數 | 值可能改變 |
2)常量及變數名起名必須遵守的規則
1 | 不能重名 |
---|---|
2 | 不能和C/C++語言里的關鍵字重名 |
3 | 必須是字母或者字母和數字的組合,符號僅_可以使用 |
4 | 名字不能用數字開頭 |
3)起名字建議遵守的規則
1 | 最好要能夠直觀表達你這個名字代表的內容 |
---|---|
2 | 名字別太長 |
4)變數定義方式
1 | 類型 名字 {初始值}; | int num {100}; |
---|---|---|
2 | 類型 名字 = {初始值}; | int num={100}; |
5)常量的定義方式
1 | 直接使用值 | 2023 |
---|---|---|
2 | const 類型 名字 {初始值}; | const int number {100}; |
3 | 類型 const 名字 {初始值}; | int const number {100}; |
4 | #define 名字 值 | #define PI 3.14 |
#include <iostream>
#define mon_fix 11 //定義常量
int main()
{
int year{ 2023 }; //定義變數
int mon{ 11 };
int day{ 9 };
const int year_fix{ 2023 }; //定義常量
//year_fix = 2024 常量不可以修改
std::cout << "時間日期顯示程式" << std::endl;
std::cout << "今年是" << year_fix << "年" << std::endl; //常量使用
std::cout << "今年是" << year_fix << "年" << mon_fix << "月" << std::endl;
std::cout << "今年是" << year << "年" << mon << "月" << day << "日" << std::endl;
year = 2024; //變數的修改、賦值
std::cout << "今年是" << year << "年" << std::endl;
}
註:不管是常量還是變數,本質上都是在記憶體中申請一塊區域,用來存放我們的數據,只不過常量申請的記憶體區域不允許修改,而變數申請的記憶體區域允許修改。以上說的可以修改和不可以修改,只是站在編輯器的角度,實際上,不管是變數還是常量,甚至已經編譯好的代碼,都可以修改。
2、布爾和整型
1)帶符號的整數類型表
類型 | 記憶體占用(位元組) | 取值範圍 |
---|---|---|
singed char | 1位元組 | -128~127 |
char | 1位元組 | -128~127或0-256,取值範圍取決於編譯器 |
short | 2位元組 | -32768~72767 |
short int | 2位元組 | -32768~32767 |
singed short | 2位元組 | -32768~32767 |
signed short int | 2位元組 | -32768~32767 |
int | 4位元組 | -232/2~232-1 |
singned | 4位元組 | -232/2~232-1 |
singed int | 4位元組 | -232/2~232-1 |
long | 4/8位元組 | 取決於編譯器,x64為8位元組,X86為4位元組 |
long int | 4/8位元組 | 取決於編譯器,x64為8位元組,X86為4位元組 |
singed long | 4/8位元組 | 取決於編譯器,x64為8位元組,X86為4位元組 |
signed long int | 4/8位元組 | 取決於編譯器,x64為8位元組,X86為4位元組 |
long long | 8位元組 | -264/2~264/2-1 |
long long int | 8位元組 | -264/2~264/2-1 |
signed long long | 8位元組 | -264/2~264/2-1 |
signed long long int | 8位元組 | -264/2~264/2-1 |
2)不帶符號的整數類型數(即沒有負數)
3)布爾類型
註:非0即為true,例-1也表示true
4)分解變數的定義方式
註:使用{}方式初始化,安全性更高,括弧中不寫內容,預設初始化為0
5)輸入和輸出
//輸入工資,把輸入的內容顯示出來
#include <iostream>
int main()
{
unsigned short salary; //工資,因後面會進行輸入,所以可以不用初始化
unsigned short bonus; //獎金
unsigned short total; //總收入
std::cout << "請輸入你的工資:";
std::cin >> salary; //輸入
std::cout << "你的工資為:" << salary << std::endl;
std::cout << "請輸入你的獎金:";
std::cin >> bonus;
std::cout << "你的獎金為:" << bonus << std::endl;
total = salary + bonus;
std::cout << "你的總收入為:" << total;
}
//若最後運算後的值超過了變數類型的範圍,則會溢出
輸入過大的數據,會超過變數的定義範圍,導致溢出
3、賦值和運算
1)整型字面量的表達
進位 | 表達方式 | 案例 |
---|---|---|
二進位 | 0b+二進位+尾碼; | 0b11L |
八進位 | 0+八進位+尾碼; | 011L |
十進位 | 十進位數+尾碼 | 35L |
十六進位 | 0x+十六進位數+尾碼 | 0xFF |
2)關於尾碼的說明
符號 | 類型 |
---|---|
L/l | long 類型 |
LL/ll | long long類型 |
U/u | 無符號類型 |
註:U/u可以和L/l或者LL/ll組合使用,如65535ULL
#include <iostream>
int main()
{
std::cout << 0b111 << std::endl; //二進位
std::cout << 0b111U << std::endl; //無符號數的二進位
std::cout << 0b111U << std::endl; //無符號數且類型為long類型的二進位
std::cout << 0b111U << std::endl; //無符號數且類型為long long類型的二進位
}
2)基本的算數運算
運算符名稱 | 運算符 | 示例 |
---|---|---|
加 | + | a=b+c;a=a+c |
減 | - | a=b-c;a=a-c |
乘 | * | a=b*c;a=a*c |
除 | / | a=b/c;a=a/c |
模(即取餘數) | % | a=b%c;a=a%c |
#include <iostream>
int main()
{
int a{ 100 };
int b{ 3 };
int c{};
c = a / b; //除法運算
std::cout << c << std::endl;
a = a % b; //模運算,即取餘數
std::cout << a << std::endl;
}
3)二元運算符
運算符名稱 | 運算符 | 示例 |
---|---|---|
加 | += | a+=1;相當於a=a+1 |
減 | -= | a-=1;相當於a=a-1 |
乘法 | *= | a*=1;相當於a=a*1 |
除 | /= | a/=1;相當於a=a/1 |
模 | %= | a%=1;相當於a=a%1 |
#include <iostream>
int main()
{
int a{ 100 };
int b{ 3 };
int c{};
c = a += b; // a=a+b; c=a
std::cout << c << std::endl;
c = a /= b; // a=a/b; c=a
std::cout << c << std::endl;
c = a %= b; // a=a%b; c=a
std::cout << c << std::endl;
}
4)遞增遞減運算符
名稱 | 運算符 | 示例說明 |
---|---|---|
先遞增 | ++a; | int a=10;int end=++a+5; //end=16;a=11; |
後遞增 | a++; | int a=10;int end=a++ +5; //end=15;a=11; |
先遞減 | --a; | int a=10;int end=--a+5; //end=14;a=9; |
後遞減 | a--; | int a=10;int end=a-- +5; //end=15;a=9; |
#include <iostream>
int main()
{
int a{ 10 };
int b{ 10 };
int c{ 10 };
int d{ 10 };
int send_1{}, send_2{},send_3{}, send_4{};
send_1 = ++a + 5;
std::cout << "先遞增示例:send_1=" << send_1 << ";a=" << a << std::endl;
send_2 = b++ + 5;
std::cout << "後遞增示例:send_2=" << send_2 << ";b=" << b << std::endl;
send_3 = --c + 5;
std::cout << "先遞減示例:send_3=" << send_3 << ";c=" << c << std::endl;
send_4 = d-- + 5;
std::cout << "先遞減示例:send_4=" << send_4 << ";d=" << d << std::endl;
}
註:一次運算最多使用一次遞增或者遞減,負責容易導致結果不確定,c++標準中可以這麼寫:end=end++ +1;但是不推薦
4、浮點數
1)浮點數數據類型
類型 | 記憶體占用(位元組) | 取值範圍 |
---|---|---|
float | 4位元組 | 大約7位精度,±3.4*10^±38 |
double | 8位元組 | 大約15位精度,±1.7*10^±38 |
long double | 8位元組 | 大約15位精度,±1.7*10^±38 |
註:表示的數若超過進度,後面的數就會用0補充
2)浮點數的表達
尾碼符號 | 表示類型 | 示例 |
---|---|---|
f或F | float類型 | 200.0f/200.0F或2E2f |
不加尾碼 | double類型 | 200.0 |
L/l | long double類型 | 200L |
註:200.0f和200L區分開,200.0f為float類型;200L為long double類型
3)浮點數註意事項
浮點數不僅可以表達小數,也可以表示整數,E幾表示10的幾次方,比如1E2=1*10^2=200;
#include <iostream>
int main()
{
float a{ 65923600.0 };
float b{ 0.00000001 };
float c{};
c = a + b;
std::cout << "c的值為:" << c << std::endl; //輸出的c的值即為a的值,因為精度丟失了
}
直接通過控制台列印出的數據不准確,可以通過設置斷點的方式,查看數據
4)練習:編寫一個程式,根據輸入的直徑,計算圓的面積
//編寫一個程式,根據輸入的直徑,計算圓的面積。面積=半徑的平方*圓周率(3.14159)
#include<iostream>
int main()
{
std::cout << "請輸入圓的半徑(單位cm):";
float d; //直徑
std::cin >> d;
float r{ d / 2 }; //半徑
float s{ r * r * 3.14159f };
std::cout <<"圓的直徑為:"<<d <<std::endl << "圓的面積為:" << s << "平方釐米";
}
5、類型轉化
1)類型轉化順序表
如下表所示,優先順序從大到小排列,兩個優先順序不同的數據進行允許,運算結果轉化為優先順序較高的數據類型。以下表為隱示數據轉化
序號 | 數據類型 |
---|---|
1 | long double |
2 | double |
3 | float |
4 | unsigned long long |
5 | long long |
6 | unsinged long |
7 | long |
8 | unsigned int |
9 | int |
註:short和char類型運算時一律轉化為int類型
2)強制類型轉換
語言 | 類型轉化語法 | 實例 |
---|---|---|
C語言 | 類型(要轉化的內容) | int a =int(b) |
C++語言 | static_cast<目標類型>(要轉化的內容) | int a =static_cast<int>(b); |
①C語言類型轉化
//C數據類型轉化
#include <iostream>
int main()
{
int a{ 500 };
unsigned b{ 1000 };
std::cout << "(a-b)=" << (int)(a - b) << std::endl; //C語言強制類型轉化
}
②C++的數據類型轉化
//C++的數據類型轉化
#include <iostream>
int main()
{
int a{ 500 };
unsigned b{ 1000 };
std::cout << "(a-b)=" << static_cast<int>(a - b) << std::endl;
}
註:賦值運算符,就會將右面的數的類型,自動轉化為左邊的數據類型,如int a=c,即使c是float類型,也會轉化為int類型,但是可能會丟失數據精度,如c=550.25f,強制轉化以後就會變為550
3)計算數據類型長度
類型占用記憶體=sizeof(類型)
#include <iostream>
int main()
{
unsigned int a{ 10025 };
long long b{ 237189372198 };
float c{ 3718392.31782 };
std::cout << "long long的大小:" << sizeof(long long) << std::endl;
std::cout << "變數a占用的大小:" << sizeof(a) << std::endl;
std::cout << "變數c占用的大小:" << sizeof(c) << std::endl;
}
6、進位轉化
1)將十進位數轉換為其他進位數
將要轉化的十進位數除以要轉化的目標進位數,得到商和餘數,商如果大於目標進位數,那麼繼續用商除以目標進位數,重覆只到商小於目標進位數,將得到的最後的商和歷次相除的餘數連接起來,就是轉化後的目標進位數
2)其他進位轉化為十進位
從最高位依次計算每一位數字和當前進位數與該為位序減一次方的乘機,最後將各位的成績相加。
①0b1111010111=1*2(10-1)+1*2(9-1)+1*2(8-1)+1*2(7-1)+0*2(6-1)+1*2(5-1)+0*2(4-1)+1*2(3-1)+1*2(2-1)+1*2(1-1)
②01727=1*8(4-1)+7*8(3-1)+2*8(2-1)+7*8(1-1)
③0x3D7=3*16(3-1)+D*16(2-1)+7*16^(1-1)
3)16進位和8進位轉2進位
①16進位數,一個數轉化為4個二進位
②8進位數,一個數轉化為3個二進位數
7、"麟江湖"激活游戲
(1)設計要求
(2)設計
#include <iostream>