C_and_CPP 板


LINE

※ 引述《tvbic (轻薄的机掰)》之铭言: : while(true) : { : cin>>a>>b; : cout<<a<<" "<<b<<" "<<test(a,b)<<endl; : } : ============================================= : while(cin>>a>>b) : { : cout<<a<<" "<<b<<" "<<test(a,b)<<endl; : } : ========================================================= : 请问一下...这二种写法有什麽不一样吗..?? : 第二个可以过...可是第一个过不了...显示time limit exceeded 推文有解释过的,就不再说了。 将 cin 的读入放到 while 的条件测试中,是 C++ 极常用的 idiom. 一方面达到读值的作用(side effect) 一方面 cin >> a >> b 这整个 expression 的结果就 是传回被读值後的 cin, cin 本身无所谓 true 或 false, 可是 while 条件需要 true 或 false, 於是程式就要去 找 cin 所属的 class (也就是 istream)是否有定义任何 conversion operator, 结果很高兴的发现了它有重载(overload) operator void* operator void* 若是传回 null (0) 就代表 false, 其他一切 non-null pointer 值就是 true. 在 operator void* 这个 overloaded function 的定义中,其实它是测试 cin 的状态是否为 fail(),若成员函式 fail()为真,则operator void* 传回 null pointer (0), 那麽 while 的测试就失败,回圈结束;否则 operator void* 就传回某个 non-null pointer 表示为 true, 那麽 while就测 试成功了,回圈继续。 那麽这个 fail() 何时会为真呢?情况有数种,包括读到档尾(eof), 或是读到不合预期的东东,像是我们这里要读 int a, 和 int b, 也就是 cin >> a >> b; 结果却读到了英文字母,那就会 fail(), 甚至另外也会检查 istream buffer 是否坏掉了,那也会 fail(). 另外 istream 也有重载 operator ! 其结果和上述颠倒。fail() 时传回真, !fail() 传回假。 另外补充,有很多人会写 while ( ! cin.eof() ) { cin >> a >> b; // 或是 getline(cin, str); // ... // 处理 a,b 或 str } 这种写法通常是错误的,因为 eof() 几乎都是发生在回圈内。 好比说资料共十笔,那麽回圈跑十次,都没问题,甚至第十一次 还是可以继续进入回圈,只是在这次的回圈内,cin 要再读进一笔 资料时,才会发现已经读到档尾了(读完第十笔时还不知道!) 读取失败,而 a,b 或是 str 的值仍然保留上一次读到的,结果 程式还认定说它是有效的并加以处理,那就错了。 所以正确的写法同样是将 cin >> a >> b 或是 getline(cin, str) 写进 while (...) 条件中。至於 eof() 的使用时机,反而要在 整个回圈结束,在程式後面,有需要检查为什麽会结束回圈时, 才来使用 eof(), 因为如同前面所说, 有可能是到了档尾,也有 可能是读到不合所需的资料,或是 istream buffer 坏掉。 但像 ACM 的 input, 都可以放心的假定它给的资料不会有这些问题。 所以都不用再做离开回圈後的额外检查。 --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.208.166
1F:推 Frozenmouse:原来是这样@@ 谢谢指教:P 220.138.122.24 06/12
2F:→ Frozenmouse:之前一直不会解释为什麽cin>>a会回传什麽||| 220.138.122.24 06/12
3F:推 JuinT630:我了解了!谢谢大大的说明! 218.170.46.188 06/14







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP