大家好,我是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)
(歡迎各位大神評論)