关于while(条件表达式)其中判断下一次 循环的 问题

kuijjhdggy 2014-10-12 11:07:16
#include<stdio.h>
#include<stdlib.h>

int IsNumber(int a)

{if(('0' <= (a)) && ((a) <= '9'))
return 1;
else
return 0;
}

char *delete_num(char *src)
{
char *slow;
char *fast;

if (NULL == src)
return NULL;

//找到第一个数字字符处
fast = src;
while (*fast && !IsNumber(*fast))
fast++;

slow = fast;
while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++))//****主要就是这里这里是如何判断是否进行下一次循环的

;

return src;
}

int main()
{
char src[] = "abcdef1234g2h3i45jk6lm7n8";

printf("%s\n", delete_num(src));

system("pause");
return 0;
}

如代码所示,一个去除字符串数字的代码,其余都 好理解,就是

while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++));

是如何判断是否继续下一次判断或者终止的。(IsNumber(*fast) ? *fast++ : (*slow++= *fast++)对while的真假判断是如何影响的(不知表达清楚了没有)
...全文
427 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2014-10-13
  • 打赏
  • 举报
回复
先别考虑*fast和IsNumber,先来看while(a ? b : c)。这里判断循环结束的条件是整个表达式 a?b:c的返回值,这个值或者是b或者是c,a只起一个选择的作用。把这个弄明白,你的代码就不难理解了。
赵4老师 2014-10-13
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
xionggch 2014-10-13
  • 打赏
  • 举报
回复
while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++)); IsNumber(*fast) ? *fast++ : (*slow++= *fast++)先解析这个表达式 IsNumber(*fast)为真返回*fast++;否则返回*slow++= *fast++ 所以while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++)); 的判断条件是*fast++或*slow++
kuijjhdggy 2014-10-12
  • 打赏
  • 举报
回复
引用 3 楼 brookmill 的回复:
[quote=引用 1 楼 brookmill 的回复:] 从判断循环终止的角度来说,把它简化为while (a ? b : c),也就是说如果a不为0,用b是否为0来判断;如果a为0则用c 具体到这里,while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++)); b和c的值实际上都是*fast,所以整个循环判断的条件就是*fast是否为0。区别就是如果*fast是数字就把它赋值给*slow
更正:如果*fast是数字就把它赋值给*slow[/quote] 为何不是判定IsNumber(*fast)的真假而是判定*fast是否为0呢?
brookmill 2014-10-12
  • 打赏
  • 举报
回复
引用 1 楼 brookmill 的回复:
从判断循环终止的角度来说,把它简化为while (a ? b : c),也就是说如果a不为0,用b是否为0来判断;如果a为0则用c 具体到这里,while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++)); b和c的值实际上都是*fast,所以整个循环判断的条件就是*fast是否为0。区别就是如果*fast是数字就把它赋值给*slow
更正:如果*fast是数字就把它赋值给*slow
brookmill 2014-10-12
  • 打赏
  • 举报
回复
整个代码的思路:两个指针,fast依次走过字符串里的每个字符,直到字符串结束(也就是while循环里面的*fast为0);slow走的比较慢,遇到数字就停下来,只有*fast非数字的时候才赋值并前进。
brookmill 2014-10-12
  • 打赏
  • 举报
回复
从判断循环终止的角度来说,把它简化为while (a ? b : c),也就是说如果a不为0,用b是否为0来判断;如果a为0则用c 具体到这里,while (IsNumber(*fast) ? *fast++ : (*slow++= *fast++)); b和c的值实际上都是*fast,所以整个循环判断的条件就是*fast是否为0。区别就是如果*fast是数字就把它赋值给*slow

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧