close


C++是強制型態的語言,就是程式中的每個項目都需要用型態來定義它是甚麼,C++編譯器會做廣泛的檢查,然而我是早期學過BASIC,而且還是直譯式那種的BASIC,所有的變數根本就不需要先定義變數的資料型態,想要甚麼變數就直接命名使用,丟數字給他..OK,丟文字給他...也OK,電腦真的好聰明,好不快活。


一開始學C++的時候真是痛苦極了,這個也編譯錯誤,那個也編譯不過,所以下課回家時都又重回BASIC的懷抱,唉....都已經不是學生了,還這樣。(當時是晚上自行到電腦補習班的課啊)。


拉回來,拉回來。

 

變數在文字方面
char    是屬於字元型態,值域範圍:'1'、'a'、'A',就是用兩個單引號包起來的單一個數字或字母。
string  是屬於字串型態,值域範圍:"sky"、"1234"、"你的我的",就是用兩個雙引號包起來的字串。

 

變數在數值為整數方面
char                   值域範圍:-128~127
unsigned char   值域範圍:0U~255U
short                  值域範圍:-32768~32767
unsignde short  值域範圍:0U~65535U
int                      值域範圍:-2147483648~2147483647
unsigned int      值域範圍:0U~4294967295
long                   值域範圍:-9223372036854775808L~9223372036854775807L
unisigned long  值域範圍:0U~18446744073609551615UL


變數在數值為浮點數方面
float              值域範圍:1.2*10^-38 ~ 3.4*10^38   小數點精確度7位
double          值域範圍:2.2*10^-308 ~ 1.8*10^308 小數點精確度15位

 

還有一種型態叫布林變數 bool,它的值只有 true(1) 或 false(0)。
在邏輯上為"真"的就是true(1)。
在邏輯上為"假"的就是false(0)。

 

文字方面的變數比較好記熟,在數值方面的值域範圍,只要是常用的範圍還可能比較容易背熟,當然啦,沒背熟的就回來查一下值域範圍就好了,不必煩惱沒給背熟。

 

變數的型態不止這幾種,但對於初學者來說這些大概也夠用了。
除了列舉資料型態外,我還認為陣列啦、結構啦、類別啦等等都是一種變數的型態(你可以不認同我這個怪想法)。


有了變數的型態後,我們要怎樣的來命名使用它呢
1.變數名稱不可以使用C++的關鍵字。
2.變數名稱的第一個字必須是大小寫的英文字母開頭,或底線 "_" 開頭,但其實不建議用底線開頭,因為很多編譯器不支持這樣的命名。
3.變數名稱可以使用大小寫字母、底線、0~9的數字等混合搭配組成的名稱。
4.變數名稱在英文字母方面,大小寫是代表不相同的變數。


所以你可以 int A25_bb,但不可以 int 25A_bb,數字開頭就不可以。
雖然你可以 char _as_you 來命名,只是完全不建議以底線為開頭的命名 。
還有大小寫不同 int ABC 和 int abc 是不相同的變數,各代表一個變數。
對了,int _ABC 雖然不是關鍵字,但一樣被禁止使用的,因為底線開頭加大寫字母這種形式的名稱已保留給函式庫使用。

 

雖然我也認為二進位數字、八進位數字、十六進位數字也是很基礎很重要的一部份,但總覺得對一位初學者來說,這是很痛苦的,因為我們活在十進位的世界裡,因為我們不是資訊系的,因為我們還不可能直接操作位元來和機器溝通,因為有太多的因為了....所以暫時略過。

 

對於數字的 + - * / 運算符號我們稱它為運算子,基本的運算子有 + - * / % , [ % ] ??  呵呵~這可不是百分比運算,% 是模數運算,就是求除法的餘數。

 


另外,雖然感覺上也是基本的運算子(因為它太常出現了),卻也同時感覺它一點也不基本,而且是惱人的計算方式,就是遞增和遞減整數,我不知道其他的語言是不是也玩這一套遞增遞減。

 

我們來看看遞增整數的寫法
先宣告一下變數 
int number = 0;             //給定任何你想要的數值都可以


number = number + 1;        //把變數加一,再存回變數本身,這個好懂
number += 1;                //上面的式子也可以寫成這樣,但加號和等號中間不可以有空格
++number;                   //上面的式子也可以寫成這樣 (老外寫的書是這樣說..但我認為 number++ 會更像)
以上三式都是一樣的答案。


把 += 改成 -= 是可行的,把 ++ 改成 -- 也是可行的,它就是遞減了。

 

那....可以套上乘法嗎?
老實說我沒看過,不敢說可不可以,但從 ++number 來看,似乎會產生問題,因為 **number ,會變成是指標的寫法,況且 ++number  是 number + 1, **number 就不知道要乘以多少了。而 number *= 2; 是可行的,但 number /= 2; 就要小心處理,因為除法容易造成非整數,會被去掉小數部位,若 number 宣告為 float型態 或 double型態就可以。

 

那....number++; 呢?


嗯~~有點不一樣卻又有點一樣,這樣不好講,套個式子來講會比較清楚。

int a = 10;
int b = 0;

 

b = ++a +7;
b 等於多少?

 

b = (a++) +7;  // 這組小括號可以省略成為  b = a++   +7; 這樣也相同,但有小括號比較好讀懂本意
b 等於多少?

 

先不給答案,先跳個主題來說....最最最基本的輸出與輸入。
還記得上次的這段程式碼嗎?
#include <iostream>

using namespace std;

int main(int argc, char** argv) 
{
    cout << "最美的風景就從這裡開始" << endl;
    return 0;
}

上次如果你有拉回去自己跑一下,應該就知道了 cout << 可以把一對雙引號內的內容輸出。

當然啦,cout << 也可以把變數輸出。

 

cout是用來輸出的函數,預訂義在標頭檔 iostream 內,只要我們把 iostream 給 include 進來,就可以使用 cout 函數了。
cin >> 變數名稱;就是讓使用者輸入資料了。


這當中的 << 和 >> 在操作位元資料時,是將位元資料向左移位和向右移位。
但使用在 cout << 當中, << 是輸出運算子,就是把右邊的資料("最美的風景就從這裡開始")傳給左邊的資料流(cout),那 cin >> 就同理可證囉。

 

另外,只要是 c++ 編譯器所提供的標頭檔,都是歸類在 std 這一個名稱空間裡,這個大概是當初 c++ 委員會決定的吧,我猜。而現今這個命名空間的規範好像有些變動,但我想 dev_c++ 5.11版應該早已出版,沒被更改到才對。照早期的規定,只要引入內定的標頭檔時,有兩種方法來操作標頭檔內的函數。


1.在所有的函數前面,宣告成全域的 using namespace std; 
2.如果你不使用前一點的宣告方法,則在所有使用到預定義的函數時,就給個 std:: 空間名稱,然後才是要使用的函數名稱 
   例. std:: cout << "最美的風景就從這裡開始" << endl;   //  :: 兩個冒號接再一起是範疇運算子, endl  是換新行
這兩種作法都有支持者與反對者很堅定的論述,就看你喜歡哪一種方法囉。

 

好了,看完了最最最基本的輸入與輸出(雖然 cin、cout  還有些許使用方式上的變化...),我們再回來

int a = 10;
int b = 0;

b = ++a +7;
b 等於多少?

b = (a++) +7;
b 等於多少?

不知道你心中的答案是多少,我們讓電腦跑跑看答案是多少,看看電腦的答案我們滿不滿意。


#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv)
 {
     int a = 10;
     int b = 0;
     b = ++a + 7;
     cout << " a = 10; b = 0;  b = ++a + 7 " << endl;
     cout << " b =  " << b << endl;
     
     a = 10;
     b = 0;
     b = (a++) + 7;
     cout << endl <<"a = 10; b = 0;  b = (a++) + 7 " << endl;
     cout << "b =  " << b << endl;
    return 0;
}

不知道你滿不滿意你的電腦的答案.....

 

 

++a 和 a++ 的差別就是
++a 是執行這一行程式碼之前 a 先遞增 +1 了。
a++ 是執行這一行程式碼完成後 a 再遞增 +1,所以這一行程式碼中的 a 還是原來的值 10。


最後聊一下,一個變數到底存在多久呢。

如果宣告在全域中,就像 suing namespace std;一樣的位置,那麼這個變數就會一直存在著,直到程式結束執行。

而如同例子中的 a 或 b 變數,

int main(int argc, char** argv)
 {
     int a = 10;
     int b = 0;
            .
            .
            .
            .
}

這時候的 a 和 b 就是區域變數,只存在 main() 這個函數的大括弧內,只要這個函數一結束,變數也就結束了。


因為目前我們只有一個函數 main(),所以感覺不出來,改天多寫出兩個函數的時候,就可以感覺到在另一個函數的變數是呼叫不到的,因為任一個函數不在執行期,他的變數是結束的、是不存在的。

 

 

 

 

 

 

 

 

 

 

延伸閱讀

 

[做中學 dev c++] dev c++

 

[伊蒙 dev c++] 視窗程式學習筆記

.

 

 

 

 

 

 

 

.

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 伊蒙‧普羅客 的頭像
    伊蒙‧普羅客

    面向陽光,陰影就會在身後

    伊蒙‧普羅客 發表在 痞客邦 留言(1) 人氣()