C++從入門到入土4——如何使用變量(不定期連載)

大家好,我是Michael_cmr(一位蒟蒻)
今天給大家講解——如何使用變量。
來吧!上節課已經說了大概的變量類型。現在開始使用變量

1.賦值操作(基本操作)

賦值操作就是給變量賦值。來,咱們上代碼!

#include<iostream>
using namespace std;
int main()
{
	int a,b,c;
	a=1,b=2,c=3;
	cout<<"a="<<a<<"  b="<<b<<"  c="<<c<<endl;
	a=50,c=8884,b=454;
	cout<<"a="<<a<<"  b="<<b<<"  c="<<c<<endl;
	a=b=c;
	cout<<"a="<<a<<"  b="<<b<<"  c="<<c<<endl;
	system("pause");
	return 0;
}

很好,讓我們一起來分析一下這段代碼。
首先,我們給整形變量a,b,c賦了初值,運用了 = 號,
然後輸出了
在這裏插入圖片描述
接着,我們又給了它們三個新的值——
於是:
在這裏插入圖片描述
我們發現,我們後面給予它們的數值覆蓋了前面的值。

最後,我們寫了一個語句“a=b=c”
這句話什麼意思呢?
就是說,把 c 的數值賦給 b 然後再給 a 。
注意我的語序是c->b->a 的,所以,可以得出賦值語句是從右往左賦值的。
來個例子證明一下
還是定義a,b,c;

#include<iostream>
using namespace std;
int main()
{
	int a,b,c;
	a=20;
	b=30;
	c=b;     //此處c的值應該爲b,也就是30,嘗試輸出一下
	cout<<"a="<<a<<"  b="<<b<<"  c="<<c<<endl;
	b=a; 	 //此處b的值應該爲a,也就是20,嘗試輸出一下
	cout<<"a="<<a<<"  b="<<b<<"  c="<<c<<endl;
	system("pause");
	return 0;
}

在這裏插入圖片描述
結果與註釋當中預料的一模一樣。所以要注意,在C++當中 a=b 和 b=a 是兩個完全不同的語句。
讓我們來一道題目體會一下:

題目:我們有整形變量a和b,現在要交換它們的值。

分析:假設我買了一瓶82年的雪碧和一瓶92年的可樂,現在要把可樂裝進雪碧瓶裏,然後把雪碧裝進可樂瓶裏。可以想象,除非我們有超能力,不然是不可能直接交換兩個飲料的。
於是,我們就想到了——我們再花3個億買下一個72年的空瓶子,然後把雪碧到進去(這時我們就的可樂瓶就空了),然後再把3億的空瓶子裏的雪碧到到可樂瓶裏————任務完成(成功AC)
代碼實現

#include<iostream>
using namespace std;
int main()
{
	int a,b,c;   //a是可樂,b是雪碧,c是空瓶子
	a=200;       //可樂有200ml
	b=300; 		 //雪碧有300ml
	cout<<"a"<<a<<"	 b"<<b<<endl;  //先輸出一下初始值 
	c=a;         //把可樂倒進空瓶裏 
	a=b;         //把雪碧倒進可樂瓶裏
	b=c; 		 //把空瓶裏的可樂倒進雪碧瓶裏
	cout<<"a"<<a<<"	 b"<<b<<endl;  //輸出交換後的值 
	system("pause");
	return 0;
}

運行結果
在這裏插入圖片描述
可以看出,我們三億元的空瓶產生了非常大的作用。

很好,細細品味一下——是不是醉了(畢竟是82年的東西)

哈哈~,我們繼續來看其他的數據類型操作

精度(就是有小數)的操作

嘻嘻~,習慣性的——咱先上代碼

#include<iostream>
using namespace std;
int main()
{
	float a;   //又是a,大家可能有點討厭它們了 
	a=3.1415926;
	cout<<a<<endl;    
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述
大家發現我們的a明明是3.1415926。但是輸出的卻只有3.14159。
這是爲什麼呢?
就是cout輸出語句自動判斷的輸出精度(一般都是5位),如果要保留2位小數的話(只是舉個例子),那麼,就要加入一些厲害的東西,請看:

#include<iostream>
#include<iomanip>     //加入的頭文件 
using namespace std;
int main()
{
	float a;  
	a=3.1415926;
	cout<<fixed<<setprecision(2)<<a<<endl;   //setprecision(2)意思是留2位有小數注意前面要加入fixed 
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述
結合註釋,你應該就知道了cout處理精度是有多麼麻煩了吧?

沒事,我們末尾有大彩蛋,不急,先往下看——

字符的操作:

#include<iostream>
using namespace std;
int main()
{
	char a,b;
	a=65;
	b='A';
	cout<<"a="<<a<<"   b="<<b<<endl;
	system("pause");
	return 0;
}                                                   

運行結果:
在這裏插入圖片描述
我們發現,字符型變量 a 的數值是65,而我們給 b 賦值是字符 ‘A’ 。然而它們的輸出卻是一樣的。
這是爲什麼呢?
這就涉及到了ASICC碼錶。(附圖一張)
在這裏插入圖片描述
這個就是常用的ASICC碼錶。
所以就可以得知,我們給 char (字符型)賦值的時候有兩種方式:
1.單引號中間加上字符 如:‘q’
2.直接寫ASICC碼錶的數值 如:87(就等於賦值了‘W’)

但是,有時候,我們會想要輸出的是我們字符變量的ASICC碼值怎麼辦呢?
這是,就有一種叫做強制類型轉換的東西。來咱上代碼

#include<iostream>
using namespace std;
int main()
{
	char a,b;
	a=65;
	b='A';
	cout<<"a="<<(int)a<<"   b="<<(int)b<<endl;
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述
不難看出,我們在輸出的時候加上了一句(int)這點代碼。這是什麼意思呢?
這個就是我們傳說中的強制類型轉換:本來他們要輸出的是字符A,但是我們把字符A轉換成了int(整形),所以,輸出的就是一個整數65(A的ASICC碼)。

當然,強制類型轉換不知這一點用處,再來一個例子:
我們有int 類型的a=214748364,還有b=999999999
然後輸出a+b的和2。
分析:這個時候,很明顯a+b超過了int類型範圍。
所以,有兩個思路:
1.定義long long 類型的c來存儲a+b的和
2。
代碼實現:

#include<iostream>
using namespace std;
int main()
{
	int a=214748364,b=999999999;
	long long c=(a+b)*2;
	cout<<c<<endl;
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述
我們發現,答案是錯誤的。哎~很奇怪,這是爲什麼呢?
原因:因爲 a 和 b 都是int類型,所以它的運行結果(就是兩數相加)也是int 類型,所以數據的溢出導致結果出錯。
於是——第二種想法,強制轉換類型:
代碼實現:

#include<iostream>
using namespace std;
int main()
{
	int a=214748364,b=999999999;
	long long c=(long long)(a+b)*2;
	cout<<c<<endl;
	system("pause");
	return 0;
}

運行結果
在這裏插入圖片描述
發現,這次就是對的了。
原理:我們把 (a+b)*2的值強制轉換成了long long類型,於是——答案正確!

從這道題我們可以看出,編譯器會自動轉換數據類型。
還記得前面我們將運算符的時候
   8/7=1
這道題嗎?
現在用數據類型的眼光來看待這個算式
8和7都是整形變量。所以,兩數相除的結果也是整數——1;
然而,根據數據類型轉換,我們又可以得出:

#include<iostream>
using namespace std;
int main()
{
	cout<<8.0/7.0<<endl;
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述
我們就發現這個時候小數就出來了。這是通過編譯器的自動轉換數據類型得到的

我們用強制轉換數據類型也可以得到同樣效果:

#include<iostream>
using namespace std;
int main()
{
	cout<<(float)8/7<<endl;
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述
發現與剛剛是一樣的。所以————自己體悟一下,這個還是比較重要的東西。
接下來——還有厲害的複合賦值表達符——就是說有兩個(或以上)字符組成的運算符(包含複合算術賦值和複合位運算賦值)共11種。
先來簡單好理解的複合算術運算符吧

#include<iostream>
using namespace std;
int main()
{
	int a=50;
	a-=2;
	cout<<a<<endl;
	a+=4;
	cout<<a<<endl;
	system("pause");	
	return 0;
}

運行結果:
在這裏插入圖片描述
這裏我們就運用了複合算術賦值符,來給 a 進行加或減。-= 和+=還有其他說有的複合賦值表達式的含義都可以理解爲 a = a + x ——這裏的加號是模擬我們要用的運算符(比如乘除加減取模都可以代替),然後x表示我們的一個常數項,就比如我們a+=4 裏面,x就是其中的4。以此類推………………
我們還有(*=   /=   %=………………【還有以後要講到的位運算】)。

接下來,還有最後一塊內容

變量的自增和自減

定義:所有類型的變量的值加或減 1 的時候,都可以寫作:
變量名++   或者    ++變量名
變量名- -   或者    - -變量名

當然,既然運算符的位置不一樣,那麼它們也不會像我們想先的那麼簡單。讓我們來一段代碼領悟一下它們的不同:

#include<iostream>
using namespace std;
int main()
{
	int a=50;
	cout<<a<<endl;    //嘗試輸出a的初始值
	a++;
	cout<<a<<endl;    //a++後的值
	int b=50;
	cout<<b<<endl;    //嘗試輸出b的初始值
	++b;
	cout<<b<<endl;     //++b後的值 
	system("pause");	
	return 0;
} 

運行結果:
在這裏插入圖片描述
貌似沒有區別是吧? 這是因爲在單獨的自增和自減中,它們的結果是一樣的。但是——

#include<iostream>
using namespace std;
int main()
{
	int a,b;
	a=b=50;        //先給他們賦初值50
	cout<<"a="<<a<<"    b="<<b<<endl;
	a=b++; 
	cout<<"a="<<a<<"    b="<<b<<endl;
	system("pause");	
	return 0;
} 

運行結果:
在這裏插入圖片描述
是不是就出現了不同?原因是我們的編譯器在執行 a = b + + 這行代碼的時候,是先將 b 的值賦給 a 然後 b 在自增 1 。
所以 a 的值跟 b 就不一樣了
如果我們換一種寫法呢?


運行結果:
在這裏插入圖片描述
這時,a 就跟 b 是一樣的了,因爲這一次的 a = + + b ,這個語句是先+ + b(b先自增 1),然後再把b 的值賦給 a 所以兩個變量的數值就一樣了。

自減(- - )的用法跟自加(++)的用法是一樣的,這裏就不多說。

好了~,讓我們一起進入彩蛋部分吧!!!

3.彩蛋

這個彩蛋其實也沒什麼,就是給大家介紹我們的新成員——printf
printf 是C語言的標準輸出,對於輸出還是很友好的(比cout簡單),但是也有一些複雜的地方。現在就讓我來爲大家一一講解:
首先,這個函數的頭文件是——
#include< cstdio>(C++風格的頭)      或者
#include< stdio.h> (C風格的頭)

既然是C語言的標準輸入輸出,那麼,我們就可以省略掉

using namespace std;

這一句話,是不是感覺瞬間少寫了很多東西?

嘻嘻~抱着這種想法,我們繼續往下——

如何使用printf 語句

舉例子:

#include<cstdio>
#include<cstdlib>   //包含了system("pause") 
int main()
{
	int a=20;
	printf("a=%d",a);
	float b=3.1415;
	printf("保留2位小數的b=%.2f",b);
	printf("保留3位小數的b=%.3f",b);
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述
發現它們是不是黏在了一行?
我們加一個‘\n’在裏面就好了——‘\n’表示的意思是換行,等同於cout裏面的endl。

我們加進去看一下

#include<cstdio>
#include<cstdlib>   //包含了system("pause") 
int main()
{
	int a=20;
	printf("a=%d\n",a);
	float b=3.1415;
	printf("保留2位小數的b=%.2f\n",b);
	printf("保留3位小數的b=%.3f\n",b);
	system("pause");
	return 0;
}

運行結果:
在這裏插入圖片描述
是不是達到了換行的效果?

接下來讓我們一起系統的學習printf語句

我們發現,printf後面有個括號,括號裏面就是我們要輸出的內容。
     接着,括號裏面有個雙引號是吧?這個雙引號裏面的除格式符外的所有字符(包括中文)直接輸出——看到這裏,大家是不是有點懵,格式符是啥?
     格式符就是我們寫的%d啊%f啊之類的
     列一個表格來寫出所有的格式符
(省略百分號)    
格式字符                意義
d           以十進制形式輸出帶符號整數(整數不輸出符號)
o           以八進制形式輸出無符號整數(不輸出前綴0)
x,X        以十六進制形式輸出無符號整數(不輸出前綴0x)
u           以十進制形式輸出無符號整數
f,lf         以小數形式輸出單、雙精度實數
e,E         以指數形式輸出單、雙精度實數
c          輸出單個字符
s          輸出字符串

在輸出小數(f,lf)的時候,我們可以在%與f或lf之間加上一個  .  然後加上一個數字n,表示輸出小數點後 n 位。

請原諒,以後的blog 中,我就將用printf語句作爲輸出語句來給大家講解(根據多年的經驗printf語句比cout快),希望大家能夠掌握這個語句!謝謝!如有出錯,多多包涵(如能指出,感激不盡)!謝謝大家!歡迎各位大神指點!
(轉載請標註出處與樓主姓名)
(QQ:2437844684)
(歡迎各位大神評論)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章