语句C++
Posted 扣得君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语句C++相关的知识,希望对你有一定的参考价值。
第5章 语句
C++ 中的大多数语句都已分号结尾,如果编码人员忘记,则会在编译时报错
简单语句
空语句
空语句就是什么也不做的语句,同理也是以分号结尾
//example1.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
; //一个空语句
int i = 0;
while (i < 5)
;
i++;
while (--i > 0)
; //一个空语句
cout << i << endl; // 0
return 0;
关于分号
分号我们漏写会报错,多写了则会将多的当做空语句处理,总之不要多写也不要少些,以免出现逻辑上的BUG,往往是难以寻找的
//example2.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
int i = 1;
;
;
// int j //error 没有分号
//规范的写法为
// int i = 1;
// int j;
return 0;
复合语句块
复合语句是指用花括号括起来的语句和声明的序列,复合语句也被称作为块,在函数、for、if、while、switch等语句都会使用到
块不以分号作为结束
//example3.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv) // main本身也是个复合语句块
int i = 0;
// cout << i << endl;//error: 'i' was not declared in this scope
int i = 1;
while (++i < 5)
cout << i << endl; // 2 3 4
//同理可以有空的块
while (--i > 0)
return 0;
语句作用域
可以在块内定义变量,定义在控制结构当中的变量只在响应语句的内部可见,一旦跳出此语句,变量就超出作用范围了
//example4.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
auto i = 1;
auto i = 2, j = 666;
cout << i << " " << j << endl; // 2 666
auto i = 999;
cout << i << endl; // 999
cout << i << endl; // 2
cout << i << endl; // 1
return 0;
条件语句
if语句
if语句的结构主要有if、else、else if组成
if与else
//example5.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
bool flag(true);
//简单的if语句
if (flag)
cout << "1" << endl; // 1
if (!flag) // no excute
cout << "2" << endl;
// if else
if (1 > 2)
cout << "1>2" << endl;
else
cout << "1<=2" << endl; // 1<=2
if (1 < 2)
cout << "1<2" << endl; // 1<2
else
cout << "1>=2" << endl;
return 0;
嵌套if语句
//example6.cpp
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
int main(int argc, char **argv)
srand((unsigned)time(NULL));
int i = rand() % 10;
cout << i << endl;
if (i < 4)
cout << "i<4" << endl;
else if (i >= 4 && i < 7)
cout << "i>=4&&i<7" << endl;
else if (i >= 7 && i < 9)
cout << "i>=7&&i<9" << endl;
else
cout << "i>=9" << endl;
return 0;
要注意的内容,当if、else、else if 后面的代码如果没有加,那么它们默认相当于为后面的一条语句加了花括号,在我们写程序时要格外的注意,以免造成BUG
悬垂else
在if语句嵌套时,它们与else是怎样的匹配关系,else前面如果没有右花括号则它与其上面距离最近的if语句匹配,否则花括号强迫else与其进行匹配
//example7.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
bool flag = true;
if (flag)
if (!flag)
cout << flag << endl;
else
cout << "else" << endl; // else
//输出 else
// else是与谁进行了匹配呢 else与距离太最近但尚未匹配的if匹配即第2个if
//如果用了括号,就很明显直到它们的匹配关系了,即花括号指明了else与谁对应
if (flag)
if (!flag)
cout << flag << endl;
else
cout << "else" << endl; // else
else
cout << "flag is false" << endl;
//可能还有很多其他情况
if (flag)
if (!flag)
cout << flag << endl;
else
cout << "else" << endl; // else
return 0;
switch语句
什么是switch语句,它是if、else if的升级版 、第一个case相当于if,其余if else相当于后面的case,default相当于末尾的else
//example8.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
char ch = 'A';
switch (ch)
case 'A':
cout << "A Block" << endl; // A Block
break;
case 'B':
cout << "B Block" << endl;
break;
case 'C':
cout << "C Block" << endl;
break;
default:
cout << "not found" << endl;
break;
//等价于
if (ch == 'A')
cout << "A Block" << endl; // A Block
else if (ch == 'B')
cout << "B Block" << endl;
else
cout << "C Block" << endl;
return 0;
switch内部的控制流
从第一个匹配成功的case开始执行向下执行直到遇见break或者执行default部分代码块后结束
//example9.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
char ch('a');
switch (ch)
case 'a':
cout << 'a' << endl;
case 'b':
cout << 'b' << endl;
case 'c':
cout << 'c' << endl;
break;
default:
cout << "not found" << endl;
break;
//会出现什么情况呢?当ch为a 或 b 或 c时都会执行从其匹配的地方向后执行
//当 ch=a 输出 a b c
//当 ch=b 输出 b c
//当 ch=c 输出 c
switch (ch)
case 'a':
cout << 'a' << endl;
case 'b':
cout << 'b' << endl;
case 'c':
cout << 'c' << endl;
default:
cout << "not found" << endl;
break;
// ch=a时 输出a b c not found
return 0;
要值得注意的是,case标签必须为整形常量表达式,任何两个case标签的值不能相同,否则会引发错误。 不在每个case代码内些break,本就违反了我们用switch的初心,而且没写好就会因漏写chanshnegBUG。
switch内部的变量定义
可以在case要执行的代码中定义变量,但其中并没有想象的那么简单
//example10.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
int v = 0;
switch (v)
case 0:
// i = 999; 错误i还没有声明
// cout << i << endl;
case 1:
// std::string filename;//错误 控制流可能绕过此初始化语句 string有隐式初始化
// cout << filename << endl;
// int j = 0;错误 控制流可能绕过此初始化语句
int i;
break;
case 2:
i = 9;
cout << i << endl; // 9
break;
default:
break;
//其实相当于在case内声明变量,相当于在此case执行时声明变量,在后面各个case内都能使用
//为什么不能初始化
//总之可能被绕开的初始化语句是不正确的写法
return 0;
如何解决这种问题呢
在花括号内初始化、仅在花括号内使用
//example11.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
int v = 0;
switch (v)
case 0:
// i = 999; 错误i还没有声明
// cout << i << endl;
case 1:
std::string filename = "cdc";
cout << filename << endl; // cdc
int j = 0;
// cout << j << endl; undefined因为filename与j的作用域仅仅在上面的花括号内
int i;
// break;
case 2:
i = 9;
cout << i << endl; // 9
break;
default:
break;
//其实相当于在case内声明变量,相当于在此case执行时声明变量,在后面各个case内都能使用
//为什么不能初始化
//总之可能被绕开的初始化语句是不正确的写法
return 0;
//输出 cdc 9
迭代语句
迭代语句在C++内主要有四大类,while语句、传统的for循环、范围的for循环、do while语句
while语句
语法格式
while(condition)
lang;
while(condition)
code block
代码样例
//example12.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char **argv)
vector<int> vecs1, 2, 3, 4;
string str = "1234";
int i = 0;
auto vec_iter = vecs.begin();
while (vec_iter != vecs.end() && i < str.size())
cout << *vec_iter << endl;
cout << str.at(i) << endl;
i++;
vec_iter++;
// 1 1 2 2 3 3 4 4
return 0;
传统for循环
语法格式
for(init-statemen;condition;expression)
lang;
for(init-statemen;condition;expression)
代码样例
//example13.cpp
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char **argv)
for (int i = 0; i < 5; i++)
cout << i << endl;
// 0 1 2 3 4
int count = 0;
for (int i = 0, j = 0; i < 5; i++, j++)
cout << i << " " << j << endl;
count++;
// 0 0 1 1 2 2 3 3 4 4
cout << count << endl; // 5
vector<int> vecs = 1, 2, 3, 4;
vector<int>::iterator iter;
for (iter = vecs.begin(); iter != vecs.end(); iter++)
cout << *iter << endl;
// 1 2 3 4
// init-statemen与expression可以为空,但condition不能为空
return 0;
范围for循环
C++11引入了一种新的循环方式,可以用来迭代具有迭代器的对象
语法格式
for(declaration:expression)
statement
for(declaration:expression)
//模式上等价于
for(auto beg=v.begin(),end=v.end();beg!=end;++beg)
statement
代码样例
//example14.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char **argv)
vector<int> vecs1, 2, 3, 4;
for (auto &num : vecs)
cout << num << endl;
num++;
// 1 2 3 4
for (int &num : vecs)
cout << num << endl;
num--;
// 2 3 4 5
string str = "abcd";
for (char &ch : str)
cout << ch << endl;
// abcd
return 0;
do while循环
do while语句与while语句非常相似,唯一的区别是,do while语句先执行循环体后检查条件,不管条件值如何,我们都至少执行一次循环。
语法格式
do
statement
while(condition);
代码样例
//example15.cpp
#include <iostream>
using namespace std;
int get_num()
static int num = 0;
++num;
return num;
int main(int argc, char **argv)
int num;
do
num = get_num();
cout << num << endl;
while (num < 5);
// 1 2 3 4 5
do
cout << get_num() << endl;
while (false);
// 6
return 0;
跳转语句
主要有三种操作 break语句、continue语句、goto语句
break语句
负责终止离它最近的while、do while、for、switch语句,并从这些语句之后的第一条语句开始继续执行
//example16.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
int i = 0;
do
cout << i << endl;
if (i > 3)
break; //离开do while循环
i++;
while (i < 10); // 0 1 2 3 4
string str = "abcd";
for (char &ch : str)
if (ch == 'c')
break; //离开for循环
switch (ch)
case 'a':
cout << ch << endlC++中 语句 #ifndef