C++ Primer 学习笔记_19_话语 -if/switch/while/for语句

C++ Primer 学习笔记_19_语句 --if/switch/while/for语句

语句

--if/switch/while/for语句



1、空语句:用于语法上需要一个语句,而逻辑上并不需要的位置,此时需要一个空语句,如:

    while (cin >> s && s != sought)
        ;	//空语句

无关的空语句并不是总是无害的!

	//此处的空语句使得循环无法正常结束!
    while (iter != ivec.end());	
    ++iter;

2、复合语句是用一对花括号将几条语句扩起来,使其在语法上成为单个语句。


3、语句作用域

    在语句的控制结构中定义的变量,仅在定义他们的块语句结束前有效。

    对于控制语句中定义的变量,限制其作用域的一个好处是:这些变量名可以重复使用而不必担心他们的当前值在每一次使用时是否正确。对于作用域外的变量,是不可能用到其在作用域内的残留值的


4if语句

    如果在条件表达式中定义了变量,那么变量必须初始化。而且:将已初始化的变量值转换成为bool类型值后,该bool类型值决定条件是否成立!

	if (int ival = compute_value())
	{
		//...
	}

【建议:】在if后面使用花括号,这样可以避免日后修改代码时产生混乱和错误。因此,无论if(或者whilefordowhile)后面是简单语句,例如:赋值或输出语句,还是其他任意类型的语句,使用花括号都是一个比较好的做法!


5switch语句

    switch语句提供了一种更方便的的方法来实现深层次嵌套的if/else逻辑

    char ch;
    int aCnt = 0,eCnt = 0,iCnt = 0,
        oCnt = 0,uCnt = 0;

    while (cin >> ch)
    {
        switch (ch)
        {
        case 'a':
            ++aCnt;	//不要忘记后面的break标号!
            break;
        case 'e':
            ++eCnt;
            break;
        case 'i':
            ++iCnt;
            break;
        case 'o':
            ++oCnt;
            break;
        case 'u':
            ++uCnt;
            break;
        }
    }
    cout << "a: " << aCnt << '\n'
         << "e: " << eCnt << '\n'
         << "i: " << iCnt << '\n'
         << "o: " << oCnt << '\n'
         << "u: " << uCnt << endl;

如果表达式与其中一个case标号的值匹配,则程序将从该标号后面的第一个语句开始依次执行各个语句,知道switch结束或者遇到break语句为止!


6default标号

    char ch;
    int vowelCnt = 0;
    int otherCnt = 0;

    while (cin >> ch)
    {
        switch (ch)
        {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            ++vowelCnt;
            break;
		default:
			++otherCnt;
			break;
        }
    }
    cout << "vowel: " << vowelCnt << endl;
    cout << "other: " << otherCnt << endl;

哪怕没有语句要在default标号下执行,定义default标号仍然是有用的。定义default标号是为了告诉读者,表明这种情况已经考虑到了,只是没什么要执行的


7switch表达式与case标号

switch求解的表达式可以非常复杂。特别是,该表达式还可以定义和初始化一个变量:

	switch(int ival = get_reponse())
	{
		//...
	}

case标号必须是整型常量表达式

	case 3.14:	//error
		//...
		break;
	case ival:	//error
		//..
		break;

且只能在最后一个case标号或default标号下才可以定义变量:

    case 'a':
        string name = "xiaofang";	//error
        break;
    case 'b':
        //..
        break;

如果必须为某个特殊的case定义变量,则需引入块语句,在该块语句中定义变量:

    case 'a':
        {
        	string name = "xiaofang";	//ok
        }
        break;
    case 'b':
        //..
        break;

8while语句

    在while中,循环条件可以是一个表达式,也可以是一个提供初始化的变量定义:

	while (int loc = search(name))
	{
		//...
	}

而且,在循环条件中定义的变量在每次循环里都要经历创建和撤销的过程。


//P179 习题6.12
int main()
{
    int maxCnt = 1,curCnt = 0;
    string now,last,ans;

    while (cin >> now)
    {
        if (now == last)
        {
            ++curCnt;
        }
        else
        {
            if (curCnt > maxCnt)
            {
                maxCnt = curCnt;
                ans = last;
            }

            curCnt = 1;
        }
        last = now;
    }
    if (curCnt != 1)
    {
        cout << ans << ": " << maxCnt << endl;
    }
	else
	{
		cout << "There is no repeated word!" << endl;
	}
}

9for循环与while的对比

while循环特别擅长在某个条件保持为真时反复的执行,而一般认为for循环是一种按步骤执行的循环!


//P181 习题6.16
int main()
{
	vector<int> ivec1,ivec2;
	int value;

	while (cin >> value && value != 32767)
	{
		ivec1.push_back(value);
	}
	while (cin >> value && value != 32767)
	{
		ivec2.push_back(value);
	}
	unsigned int n = (ivec1.size() < ivec2.size() ? ivec1.size() : ivec2.size());

	for (vector<int>::size_type i = 0; i != n ; ++i)
	{
		if (ivec1[i] != ivec2[i])
		{
			cout << "false" << endl;
			return 0;
		}
	}
	cout << "true" << endl;
}

10dowhile语句

    1)与while语句不同,dowhile保证循环体至少执行一次,而且dowhile语句是以;分号结束

    2)如果把变量定义在了do内部,那么该变量的作用域就被限制在while前的花括号之前了

    do
    {
        int ival = 1;
    }
    while (ival == 1);//error

//P183 习题6.18
int main()
{
    string str1,str2;
    do
    {
        cout << "Please input two strings:" << endl;
        cin >> str1 >> str2;
        if (str1 > str2)
        {
            cout << str1 << " is bigger!" << endl;
        }
        else
        {
            cout << str2 << " is bigger!" << endl;
        }
        cout << "continue?" << endl;
        cin >> str1;
    }
    while (str1 != "no" && str1 != "No" && str1 != "NO");
}