1. 程式人生 > >C++學習之迴圈和關係表示式(1)

C++學習之迴圈和關係表示式(1)

在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()返回一個正數值。相反則返回負數。

順便說一句,雖然不能用關係運算符來比較字串,但卻可以用他們來比較字元,因為字元實際上是整型。