cpp:varconst
國立屏東大學 資訊工程學系 物件導向程式設計
3. 變數與常數
3.1 變數
- C++語言變數命名具備以下規定:
- 只能使用英文大小寫字母、數字與底線(_)
- 不能使用數字開頭
- 大寫與小寫字元將視為不同字元
- 不能與C++語言的保留字相同
- 在C++的實作中,以一個底線開頭後接一個大寫字母,或是以兩個底線開頭的變數,被保留做為C++的實作用途(供編譯器及其相關資源使用)。因此,使用這樣的命名並不會造成compiler的錯誤,但有可能造成執行上的錯誤。
C++語言共有以下84個保留字:
| alignas | alignof | and | and_eq | asm | auto | bitand |
| bitor | bool | break | case | catch | char | char16_t |
| char32_t | class | compl | const | constexpr | const_cast | continue |
| decltype | default | delete | do | double | dynamic_cast | else |
| enum | explicit | export | extern | false | float | for |
| friend | goto | if | inline | int | long | mutable |
| namespace | new | noexcept | not | not_eq | nullptr | operator |
| or | or_eq | private | protected | public | register | reinterpret_cast |
| return | short | signed | sizeof | static | static_assert | static_cast |
| struct | switch | template | this | thread_local | throw | true |
| try | typedef | typeid | typename | union | unsigned | |
| using | virtual | void | volatile | wchar_t | while | xor |
| xor_eq |
變數可以在任何地方加以宣告,只要在第一次使用前完成宣告即可。
using namespace std;
#include <iostream>
int main ()
{
double a;
cout << "Hello, this is a test program." << endl;
cout << "Type parameter a: ";
cin >> a;
a = (a + 1) / 2;
double c;
c = a * 5 + 1;
cout << "c contains : " << c << endl;
int i, j;
i = 0;
j = i + 1;
cout << "j contains : " << j << endl;
return 0;
}
我們可以利用這個C++的特性,將程式寫的更有彈性。請參考下面這個程式:
using namespace std;
#include <iostream>
int main ()
{
double a;
cout << "Type a number: ";
cin >> a;
{
int a = 1;
a = a * 10 + 4;
cout << "Local number: " << a << endl;
}
cout << "You typed: " << a << endl;
return 0;
}
此外,C++還允許我們在宣告變數時,使用別的變數做為初始值設定的一部份,請參考下面這個程式:
#include <iostream>
using namespace std;
int main ()
{
double a = 12 * 3.25;
double b = a + 1.112;
cout << "a contains: " << a << endl;
cout << "b contains: " << b << endl;
a = a * 2 + b;
double c = a + b * a;
cout << "c contains: " << c << endl;
return 0;
}
我們也可以在迴圈中宣告變數,其生命週期就僅限於迴圈內,請參考下面的程式:
using namespace std;
#include <iostream>
int main ()
{
int i; // Simple declaration of i
i = 487;
for (int i = 0; i < 4; i++) // Local declaration of i
{
cout << i << endl; // This outputs 0, 1, 2 and 3
}
cout << i << endl; // This outputs 487
return 0;
}
若在區域內的變數與某個全域變數名稱相同,只要加上“::“就可以在區域內使用,請參考下面的程式:
#include <iostream>
using namespace std;
double a = 128;
int main ()
{
double a = 256;
cout << "Local a: " << a << endl;
cout << "Global a: " << ::a << endl;
return 0;
}
3.2 常數
- 以const宣告之變數,其值不能被變更,稱為常數。例如:
const double radius = 5.5;
- 也可以用#define這一個preprocessor directive來定義常數。例如:
#define PI 3.1415926
3.3 新的初始值給定方式
C++提供了新的變數初始值給定的方法,
type valName = value; type valName(value); type valName = {value}; type valName{value};
其中最後一種宣告的方法,是在C++11的標準才開始提供,所以在編譯時必須要使用「-std=gnu++11」的選項才能順利的編譯。請參考下面的例子:
using namespace std;
#include <iostream>
int main()
{
int i = 3;
int j (4);
int k = {5};
int l {6};
cout << "i=" << i << endl;
cout << "j=" << j << endl;
cout << "k=" << k << endl;
cout << "l=" << l << endl;
return 0;
}
上述這個程式的編譯與執行畫面如下:
[03:39 user@ws ch3]$ g++ -std=gnu++11 newVarInitial.cpp [03:39 user@ws ch3]$ ./a.out i=3 j=4 k=5 l=6 [03:39 user@ws ch3]$
新的宣告方式,還提供了型態安全的檢查,我們將上面的程式修改如下:
using namespace std;
#include <iostream>
int main()
{
int i = 3.5;
int j (4.5);
int k = {5.5};
int l {6.5};
char x {332};
cout << "i=" << i << endl;
cout << "j=" << j << endl;
cout << "k=" << k << endl;
cout << "l=" << l << endl;
return 0;
}
其編譯結果如下:
[03:52 user@ws ch3]$ g++ -std=gnu++11 newVarInitial2.cpp
newVarInitial2.cpp: In function ‘int main()’:
newVarInitial2.cpp:8:15: warning: narrowing conversion of ‘5.5e+0’ from ‘double’ to ‘int’ inside { } [-Wnarrowing]
newVarInitial2.cpp:9:13: warning: narrowing conversion of ‘6.5e+0’ from ‘double’ to ‘int’ inside { } [-Wnarrowing]
newVarInitial2.cpp:10:14: warning: narrowing conversion of ‘332’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
newVarInitial2.cpp:10:14: warning: overflow in implicit constant conversion [-Woverflow]
[03:53 user@ws ch3]$ ./a.out
i=3
j=4
k=5
l=6
[03:53 user@ws ch3]$
注意到了嗎?新的「{}」方式還會進行型態安全的檢查。我們將「{}」這種宣告初始值的方法稱為List Initialization。當「{}」內沒有提供初始值時,編譯器會以0做為初始值。
最後C++還提供了一種新的宣告方式:
auto valName = value; auto valName (value); auto valName = {value}; auto valName {value};
使用「auto」是讓編譯器視變數的初始值,自動決定適切的資料型態。
cpp/varconst.txt · 上一次變更: 2022/02/25 07:03 由 junwu
