您的位置:首页 > 编程语言 > C语言/C++

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

2015-11-06 12:11 686 查看


语句

--if/switch/while/for语句

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

[cpp]
view plaincopyprint?





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

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


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

[cpp]
view plaincopyprint?





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

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

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

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

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

[cpp]
view plaincopyprint?





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

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


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

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

[cpp]
view plaincopyprint?





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;  

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语句为止!

6、default标号

[cpp]
view plaincopyprint?





  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;  

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标号是为了告诉读者,表明这种情况已经考虑到了,只是没什么要执行的

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

[cpp]
view plaincopyprint?





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

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


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

[cpp]
view plaincopyprint?





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

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


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

[cpp]
view plaincopyprint?





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

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


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

[cpp]
view plaincopyprint?





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

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


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

[cpp]
view plaincopyprint?





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

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


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

[cpp]
view plaincopyprint?





//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;  
    }  
}  

//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;
}
}


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

[cpp]
view plaincopyprint?





//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;  
}  

//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;
}


10、dowhile语句
    1)与while语句不同,dowhile保证循环体至少执行一次,而且dowhile语句是以;分号结束
    2)如果把变量定义在了do内部,那么该变量的作用域就被限制在while前的花括号之前了

[cpp]
view plaincopyprint?





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

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


[cpp]
view plaincopyprint?





//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");  
}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ for while switch if