【新手】循环

zhoumiao48 2016-11-06 11:51:45
while(~scanf("%d",&a))是什么含义?
刚刚接触c,能不能说的具体点,我知道怎么用这个但是原理不知道。
...全文
355 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-11-08
  • 打赏
  • 举报
回复
不要使用
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;
 //...
}
类似的例子还可以举很多。
begodliker 2016-11-07
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
关键了解scanf返回值含义 http://en.cppreference.com/w/c/io/fscanf Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned. 就是说scanf失败返回EOF (-1),而EOF作~运算后的值为0 这样就可以在scanf失败时退出循环
小灸舞 2016-11-07
  • 打赏
  • 举报
回复
scanf()函数返回成功赋值的数据项数,出错时则返回EOF(-1) 也就是说scanf返回值的取值范围是大于等于-1的整数 只有返回值为EOF时 其取反的的值 即while循环的判断条件才为0 才能结束循环 其它输入情况下(无论是否输入成功) while循环的判断条件为非0 即为真 楼主给出的程序是很不严谨的 一但输入的值为字母符号之类的 scanf赋值不成功把读到的内容又返回到stdin的缓冲区 假设这个被吐回的值为t 由于scanf返回的值不是EOF而是其它非负整数 其取反得到的值使while又进入到下一次循环 scanf又从stdin缓冲区里读到了原先吐回的t 往返如此成了死循环…… 楼主的代码要想执行成功只有这样操作 输入个int类型的值后再回车 接着可多次如上操作 想结束输入时 再人为制造个EOF(ctrl+z/d) 再回车使while循环条件为假结束循环 这时n的取值为最后一次成功读取到的int型数值 总得来看这是个很不可取的赋值语句 建议这样来写更易控制 while((scanf("%d", &n)) != 1) while(getchar() != '\n');
paschen 2016-11-06
  • 打赏
  • 举报
回复
关键了解scanf返回值含义 http://en.cppreference.com/w/c/io/fscanf Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned. 就是说scanf失败返回EOF (-1),而EOF作~运算后的值为0 这样就可以在scanf失败时退出循环

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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