《 C 语言的一些“骚操作”及其深层理解》之出神入化的for循环
扫描二维码
随时随地手机看文章
出神入化的for循环
for循环我们再熟悉不过了,通常我们使用它都是中规中矩的,如下例:
int i;
for(i=0;i<100;i++)
{...}
但是如果我们对for循环的本质有更深刻的理解的话,就可以把它用得出神入化。
for后面的括号中的东西我称之为“循环控制体”,分为三个部分,如下图所示。
图2.6 for循环的“循环控制体”
B、C三个部分,其实随意性很大,可以是任意一个表达式。所以,我们可以这样写一个死循环:
for(1;1;1) //1本身就是一个表达式:常量表达式
{
...
}
当然,我们经常会把它简化成:
for(;;)
{
...
}
既然循环控制体中的A只是在循环开始前作一个初始化的操作,那我这样写应该也没毛病:
int i=0;
for(printf("Number:\r\n");i<10;i++)
{
printf(" %d\r\n",i);
}
B是循环执行的条件,而C是循环执行后的操作,那我们就可以把一个标准的if语句写成for的形式,而实现同样的功能:
if(strstr("hello world!","abc"))
{
printf("Find Sub-string");
}
char *p;
for(p=strstr("hello world!","abc");p;p=NULL)
{
printf("Find Sub-string");
}
以上的例子可能有些鸡肋,“一个if能搞定的事情,我为什么要用for?”,没错。我们这里主要是为了解释for循环的灵活用法。深入理解了它的本质,有助于我们在实际开发中让工作事半功倍,以及看懂别人的代码。
以下我再列举几个for循环灵活应用的例子,供大家回味。
例1:
char *p;
for(p="abcdefghijklmnopqrstuvwxyz";printf(p);p++) printf("\r\n");
提示:printf我们太熟悉了,但是有几个人知道printf是有返回值的?输出应该是怎样的?
例2:
char *p;
unsigned char n;
for(p="ablmnl45ln",n=0;((*p=='l')?(n++):0),*p;p++);
提示:还记得C语言中的三目运算和逗号表达式吗?n应该等于几?
例3:
unsigned char *index="C[XMZA[C[NK[RDEX@";
char *alphabet="EHUIRZWXABYPOMQCTGSJDFKLNV ";
int i=0;
for(;(('@'!=index[i])?1:(printf("!!Onz\r\n"),0));i++)
{printf("%c",alphabet[index[i]-'A']);}
提示:天书模式已开启。如果看不懂,你可能会错过什么哦!