【速过C primer plus】第六章
一、循环条件框的递增递减判断
1)while
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x = 10;
while (--x>0)
printf("%d",x);
}
//输出:987654321
前缀递增递减符,符合标准循环变量的运算方式(符合直觉,输出的循环变量和实际判定时的循环变量相等)。
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x = 10;
while (x-->0)
printf("%d",x);
}
//输出:9876543210
后缀递增递减符,不符合直觉计算,对运算方式进行分析:
①条件框可以变为:int b=x
并且保证b>0
②所以在循环进行中,b的取值应该为:10、9、8、7、6、5、4、3、2、1→跳出
总结:x会先给条件框赋值,判断完成后进行x=x-1
,所以在printf中会输出0,输出的循环变量总是比判定时的循环变量小于1。后缀递增递减符会导致循环多进行一次。
2)for
对于for循环,递减递增符有两个位置可以放置:增减框和条件框。
增减框
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
for (int x = 10; x >0;x--)
printf("%d", x);
}
//输出:10987654321
增减框无论前缀还是后缀都不会影响输出结果,即增减框是单独进行的,前后缀不会影响计算顺序。
条件框
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
for (int x = 10; x-- >0;)
printf("%d", x);
}
//输出:9876543210
条件框中的运算结果和while循环中完全一样,前后缀输出值也是一样的。
**※注意:**for循环第一次进行判定时,不会进行增减框运算,所以导致了增减框中输出了10
;在其他放置方式中第一次运算判定框结束后,增减一定进行过了,所以导致无法输出10。
3)do-while
include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x = 10;
do {
printf("%d", x);
} while (--x > 0);
}
//输出:10987654321
前缀增减符时,判定时的循环变量总是比输出时的循环变量小1。
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x = 10;
do {
printf("%d", x);
} while (x-- > 0);
}
//输出:109876543210
后缀增减符时,判定时的循环变量和输出的循环变量相等,最符合直觉。
do-while是一个少用的循环语句,它的优势在于他会先进行一次语句然后再判定循环是否需要进行。劣势在于do-while不符合直觉计算,并且是唯一一个需要添加;
的循环语句,注意千万不要忘记在结尾加上这个了。
总结:对于while和for这种端循环的方式,前缀递增递减符可以保证在进行判定的循环变量和进入循环体的循环变量相等;对于do-while这种尾循环方式,后缀递增递减符可以保证进入循环体的变量和进行判定时的循环变量相等。判定框中最好就不要用递增递减符,判定运算可以放在循环体中更好控制。
二、冷门运算符:其他赋值运算符与逗号运算符
1)其他赋值运算符
以+=
为例,运算顺序可以写成,A+=B可以拆分成A=A+(B),前缀符号不会改变后面算式的运算顺序。
2)逗号运算符
逗号运算符可以连接多重语句,每条语句都会运行:
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x;
scanf("%d", &x), printf("结果为%d",x);
}
//输出:
//2
//结果为2
逗号运算符的计算结果为逗号右边的值:
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x;
x = (1,2);
printf("%d",x);
}
//输出:2
※逗号运算符的运算优先级低于等号,导致你没加括号的时候等于前面的值,所以写逗号运算符必须要配合等号
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x;
x = 1,2;
printf("%d",x);
}
//输出:1
复杂情况下的逗号运算符:
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x,y,z;
x =(y=3,(z=++y+2)+5);
printf("%d",x);
}
//输出:11
虽然逗号运算符的运算结果是右值,但是在运算时还是会从左到右按优先级进行运算。这个算式解释为:y=3,然后进行y++和y+2,然后y+5,z=y,最后x=z。
多重逗号运算符:
#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
int x,y;
x = (1, (2, 3), (y=7,8));
printf("%d和%d",x,y);
}
//输出:8和7
特别注意逗号运算符的优先级是低于等号的,所以很容易出现违背直觉的结果。