5. 循环和关系表达式

120 阅读3分钟

5. 循环和关系表达式


for

三段式

for(起始条件;终止条件;更新表达式) {}

其执行顺序为:

  1. 执行起始条件
  2. 检查终止条件
  3. 执行循环操作
  4. 更新表达式

for循环是入口循环条件。即先进行终止检查,再执行循环,最后执行更新表达式。当表达式为false时,将不会执行循环。

基于范围的for

对每个元素按顺序重复执行的for循环

// 对expression中每个元素都执行一遍操作
for (for-range-declaration : expression)
{}
​
//ex
int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for(int y : x ) {   // 使用auto自动推断得了。
        cout << y << " ";
    }
    cout << endl;

表达式、语句、运算符

表达式

  • 任何或任何有效的值和运算符的结合就是表达式。

  • 表达式都有值。赋值表达式的值为左侧成员的值

  • 赋值运算符是从右向左结合的

    // 首先将0赋给z, 再将z = 0赋给y,依次类推。
    x = y = z = 0;
    
  • <<运算符的优先级比表达式中使用的运算符(+-*/%<>=)高

语句

表达式加上;就是语句。但反过来不对(如声明语句)。

运算符

  1. 指针自增、自减

    ++, --运算符后缀和前缀的优先级不同。优先级:后缀 > 前缀 = 解除引用运算符 (以从右往左的方式结合)

    int arr[5] = {11, 22, 33, 44, 55}
    int *pt = arr;  // *pt = 11
    ++pt;  // *pt = 22  表达式值22// 假设下面语句不会相互干涉// 前缀  按照从右向左的方式结合
    *++pt;  // 先++pt,再解除引用。  // *pt = 33, 表达式值33
    ++*pt;  // 先*pt, 再++, // *pt = 22, 表达式值23  注意这将改变数组内的值// 后缀 优先级高于解除引用
    *pt++;  // 先pt++, 再*  // *pt = 33, 表达式值33// 括号改变优先级
    (*pt)++;  // 先*,再对值++  *pt = 22; 表达式值为23
    
  2. ,运算符

    将两条语句放在仅允许存放一个表达式的地方,中间可以使用隔开。

    规定:

    • 保证先计算第一个表达式,再计算第二个表达式
    • 表达式的值为第二个表达式的值
    • ,运算符的优先级在运算符中最低。

    注意分别列表分隔符和运算符

    int j = 0, i = word.size() - 1;  // 列表分隔符
    i = 20, j = 2 *i;  // ,运算符cast = 17, 240;  // cast 被设置为17,因为 = 优先级高, 但是表达式的值为240(cout 此表达式为240)
    (cast = 17), 240;  // cast 被设置为17,于上式同
    cast = (17, 240);  // cast 被设置为240。
    

while

// 如果测试条件的值为true,则执行表达式
// while 也是入口条件。(先检测,再循环)
while(测试条件) {}

在直到循环计数时使用for,在无法知道次数时使用while

// 至少执行一次的while循环
// do-while 为出口条件。(先循环,再检测)
do
{}
while(测试条件)

文件尾条件

// 使用循环读取输入,并使用某个字符停止
// cin 会忽略空格和换行符,cin.get(ch)不会
char ch;
cin.get(ch);
while(ch != "#")
{
    cout << ch;
    ...;
    cin.get(ch);
}
​
​
// 每次读取一个字符,直到遇到EOF停止的字符输入做法
while (cin.get(ch))
{
    body;
}

二维数组

// 二维数组初始化方法
int max[2][3] = 
{
    {1, 2, 3},
    {6, 2, 8}
}