C++ Primer 学习笔记_19_语句 --if/switch/while/for语句
2015-11-06 12:11
686 查看
[cpp]
view plaincopyprint?
while (cin >> s && s != sought)
; //空语句
无关的空语句并不是总是无害的!
[cpp]
view plaincopyprint?
//此处的空语句使得循环无法正常结束!
while (iter != ivec.end());
++iter;
2、复合语句是用一对花括号将几条语句扩起来,使其在语法上成为单个语句。
3、语句作用域
在语句的控制结构中定义的变量,仅在定义他们的块语句结束前有效。
对于控制语句中定义的变量,限制其作用域的一个好处是:这些变量名可以重复使用而不必担心他们的当前值在每一次使用时是否正确。对于作用域外的变量,是不可能用到其在作用域内的残留值的!
4、if语句
如果在条件表达式中定义了变量,那么变量必须初始化。而且:将已初始化的变量值转换成为bool类型值后,该bool类型值决定条件是否成立!
[cpp]
view plaincopyprint?
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;
如果表达式与其中一个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;
哪怕没有语句要在default标号下执行,定义default标号仍然是有用的。定义default标号是为了告诉读者,表明这种情况已经考虑到了,只是没什么要执行的!
7、switch表达式与case标号
switch求解的表达式可以非常复杂。特别是,该表达式还可以定义和初始化一个变量:
[cpp]
view plaincopyprint?
switch(int ival = get_reponse())
{
//...
}
而case标号必须是整型常量表达式
[cpp]
view plaincopyprint?
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定义变量,则需引入块语句,在该块语句中定义变量:
[cpp]
view plaincopyprint?
case 'a':
{
string name = "xiaofang"; //ok
}
break;
case 'b':
//..
break;
8、while语句
在while中,循环条件可以是一个表达式,也可以是一个提供初始化的变量定义:
[cpp]
view plaincopyprint?
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;
}
}
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;
}
10、dowhile语句
1)与while语句不同,dowhile保证循环体至少执行一次,而且dowhile语句是以;分号结束
2)如果把变量定义在了do内部,那么该变量的作用域就被限制在while前的花括号之前了
[cpp]
view plaincopyprint?
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");
}
语句
--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");
}
相关文章推荐
- PHP8新特性之match表达式
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 杀毒软件 Dr.Web Anti-virus for Windows Vista 4.44.0 Beta
- C#中循环语句:while、for、foreach的使用
- for 提取文本整行内容的方法
- dos命令for用法详解
- cmd if条件 条件判断
- for命令的一些bug分析
- 批处理 FOR参数/F之tokens详解
- 三个有用的 Switch 命令
- 详解Lua中的if语句的使用方法
- Lua中调用C++函数示例
- Lua中数字for循环实例
- Lua教程(一):在C++中嵌入Lua脚本
- perl 控制结构 条件控制 if while