if 语句

if 语句的格式是:

1
2
3
4
5
6
if (判定条件)
{
    语句 1;
    语句 2;
    ...
}

当 if 后小括号里的值判定为 1 时,才会执行花括号里的代码。(大于等于 0.5 均视为 1,反之均视为 0)

如:

1
2
3
4
if (3)
{
    a = 15 + 6;
}

或者

1
2
3
4
5
6
a = 15;
if (a)
{
    a -= 3;
    a *= 2;
}

或者

1
2
3
4
5
6
7
a = 15;
b = 2;
if ((a >= 12) && (a != b))
{
    a -= b;
    b += 1;
}

以上 if 语句括号中的判定都是 1,花括号里内容都会执行。

当花括号中只有一句话时,可以省略花括号,如:

1
2
if (3)
    a = 15 + 6;

else 语句

与 if 作伴的还有一个 else 语句,这个语句必须和 if 语句在一起才能使用,格式为:

1
2
3
4
5
6
7
8
if (判定条件)
{
    语句 1;
}
else
{
    语句 2;
}

当 if 内判定为 1 时执行语句 1,否则执行语句 2。

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
if (判定条件 1)
{
    语句 1;
}
else if (判定条件 2)
{
    语句 2;
}
else if (判定条件 3)
{
    语句 3;
}
else if ...

你可以在后面加很多个 else if,对于每一个 else if 来说,只有在前面的所有 if 和 else if 均判定为0时,才会进行该 else if 的判定。

关于花括号

if 语句的执行代码如果只有一句,那么是可以不用花括号的(当然用了也是对的),如:

1
2
if (i <= 1)
    i += 1;

但是,如果你的 if 语句的执行代码有两句及以上,如:

1
2
3
if (i <= 1)
    i += 1;
    i *= 12;

在这里,事实上只有 i += 1; 是属于 if 的管辖范畴,即使你把 i *= 12;i += 1; 对齐也是没有用的。

所以这里你必须使用花括号,改成:

1
2
3
4
5
if (i <= 1)
{
    i += 1;
    i *= 12;
}

花括号的意义把里面的代码段整合为一个语句块。

即:一个花括号等效于一个语句

对于有 else 的多个 if 的复合语句,建议全部使用花括号。例如下面这段代码:

1
2
3
4
5
if (i <= 3)
    if (j >= 6)
        i += j;
else
    i -= j;

这段代码的 else 看起来是对应的是第一个 if。然而事实上,else 遵循就近原则,它与离自己最近且未和 else 配对的 if 进行配对,所以实际上这个 else 对应的是第二个 if,所以实际上相当于是:

1
2
3
4
5
if (i <= 3)
    if (j >= 6)
        i += j;
    else
        i -= j;

这就和我们想要的效果不同了。所以这段代码应该改为:

1
2
3
4
5
6
7
if (i <= 3)
{
    if (j >= 6)
        i += j;
}
else
    i -= j;

这样 else 就与第一个 if 配对。

使用 if 还不够熟练时,建议全部使用花括号,不管是单个语句还是多个语句,避免出错。注:之后学习的 while, do, for 等都是这样。

扩展:事实上 else if 只是一种便于阅读的缩写。例如开头那个例子,它的完全体写法是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (判定条件 1)
{
    语句 1;
}
else
{
    if (判定条件 2)
    {
        语句 2;
    }
    else
    {
        if (判定条件 3)
        {
            语句 3;
        }
        else ...
    }
}

显然不如把 else if 写在一起更好阅读。

switch 语句

switch 语句的通式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch (被测量值)
{
    case  1:
        代码 1;
        break;

    case  2:
        代码 2;
        break;

    ...

    default:
        代码 n+1;
}

被测量值可以是一个变量,一个返回值不确定的函数等。

case 后的内容是被测量值有可能的取值。case 应以冒号结尾。

代码 1 是指被测量值为值 1 的时候执行的代码,同理,代码 2 是被测量值为值 2 时执行的代码。记住每一个 case 段落最后要加上一个 break; 结尾。

最后以 default: 结尾,当被测量值不满足之前给出的 n 个 case 时,执行 default 后的代码。当然 default 段落也可以不写。

上述 switch 其实等效于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (被测量值 ==  1)
{
    代码 1;
}
else if (被测量值 ==  2)
{
    代码 2;
}
else if...
...
else
{
    代码 n+1;
}

不同的 case 可以共用一个代码段,例如下面的格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch (被测量值)
{
    case  1:
    case  2:
    case  3:
        代码 1;
        break;

    case  4:
    case  5:
        代码 2;
        break;

    ...

    default:
        代码 n+1;
}

它等效于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (被测量值 ==  1 || 被测量值 ==  2 || 被测量值 ==  3)
{
    代码 1;
}
else if (被测量值 ==  4 || 被测量值 ==  5)
{
    代码 2
}
else if...
...
else
{
    代码 n+1;
}