C++學習之迴圈和關係表示式(1)
阿新 • • 發佈:2018-12-13
在c語言中我這部分還算學習的挺好,所以這部分我只新增一些我不太懂的點:
1.通常,cout在顯示bool值之前將它們轉換為int,但是在前面使用cout.setf(ios:boolalpha)函式呼叫設定了一個標記,該標記命令cout顯示true和false,而不是1和0;
2.附加一個小程式。0-15的階乘:
#include<iostream> const int ArSize = 16; int main(void) { using namespace std; long long factorials[ArSize]; factorials[1] = factorials[0] = 1LL; for (int i = 2; i < ArSize; i++) { factorials[i] = i*factorials[i - 1]; } for (int i = 0; i < ArSize; i++) { cout << i << "! =" << factorials[i] << endl; } }
3.小程式區別x++和++x
/*小例子區別++x和x++*/ #include<iostream> int main() { using std::cout; int a = 20; int b = 20; cout << "a = " << a << ": b = " << b << "\n"; cout << "a++ = " << a++ << ": ++b = " << ++b << "\n"; cout << "a =" << a << ": b= " << b << "\n"; }
區別一樣就能看出來了。++x是修改後使用,x++是使用後修改。
4.複合語句還有一種有趣的特性。如果在語句塊中定義一個新的變數,則僅當程式執行該語句塊中的語句時,該變數才存在。執行完該語句塊後,變數將被釋放。這表明此變數僅在該語句塊中才是可用的:
#include<iostream> int main() { using std::cout; int x = 20; { int y = 100; cout << x << "\n"; cout << y << "\n"; } cout << x << "\n"; cout << y << "\n";//invalid,won't compile }
5.sring類物件的內容反轉
#include<iostream>
#include<string>
int main()
{
using namespace std;
cout << "Enter a word ";
string word;
cin >> word;
char temp;
int i, j;
for (j = 0, i = word.size() - 1; j < i; --i, ++j)
{
temp = word[i];
word[i] = word[j];
word[j] = temp;
}
cout << word << "\nDone\n";
return 0;
}
6.提供一個簡單的例子反應等於(==)與賦值運算子(=)的區別和以後可能出現的問題
#include<iostream>
int main()
{
using namespace std;
int quizscores[10] =
{ 20, 20, 20, 20, 20, 19, 20, 18, 20, 20 };
cout << "Doing it right:\n";
int i;
for (i = 0; quizscores[i] == 20; i++)
{
cout << "quiz" << i << "is a 20\n";
}
//warning :you may prefer reading about this program
//to actually running it.
cout << "Doing it dangerously wrong:\n";
for (i = 0; quizscores[i] = 20; i++)
{
cout << "quiz" << i << "is a 20\n";
}
return 0;
}
當然錯誤出現在
for (i = 0; quizscores[i] == 20; i++)
{
cout << "quiz" << i << "is a 20\n";
}
首先,由於將一個非零的值賦值給陣列元素,因此表示式始終為非零,所以始終為true。其次,由於表示式將賦值賦給陣列元素,他實際上修改了資料。第三由於測試表達式一直為true,因此程式在到達陣列結尾後,仍不斷修改資料。
7.假設要知道字元陣列中的字串是不是mate。如果word是陣列名,下面的測試可能並不能像我們預想的那樣工作:
word=="mate";
請記住,陣列名是陣列的地址。同樣,用引號括起來的字串常量也是其地址。因此,上面的關係式不是判斷兩個字串是否相同,而是檢視它們是否儲存在相同的地址上。當然他們的地址不是相同的。
當然比較時我們應該使用字串庫中的strcmp()。
strcmp(),接收兩個字串地址作為引數。這意味著引數可以是指標、字串常量或字元陣列名。如果兩個字串相同,該函式返回0;如果第一個字串按字母順序排在第二個字串後面,則strcmp()返回一個正數值。相反則返回負數。
順便說一句,雖然不能用關係運算符來比較字串,但卻可以用他們來比較字元,因為字元實際上是整型。