C_and_CPP 板


LINE

※ 引述《david830317 (dd810)》之铭言: : 开发平台(Platform): (Ex: VC++, GCC, Linux, ...) : Xcode : 额外使用到的函数库(Library Used): (Ex: OpenGL, ...) : 问题(Question): : 在xcode时用void以外不能用reture : 错误结果(Wrong Output): : Control may reach end of non-void function : 程式码(Code):(请善用置底文网页, 记得排版) : http://ideone.com/T36LJH : 补充说明(Supplement): 关於这个 function 的写法 float Quantity::calcValue() const { if (unit >= 1 && unit <= 10) { return unit * 3.00; } if (unit >= 11 && unit <= 50) { return unit * 2.50; } if (unit >= 51) { return unit * 2.00; } } 我比较建议用 if-elseif-elseif 的结构来写: float Quantity::calcValue() const { if (unit >= 1.0f && unit <= 10.0f) { return unit * 3.00f; } else if (unit > 1.0f && unit <= 50.0f) { return unit * 2.50f; } else if (unit >= 50.0f) { return unit * 2.00f; } else { /* default */ return unit; } /* Unreached */ } 原因: 1. 这样才看得清楚这三条 if 其实是负责同一件事,条件排列整齐後,漏网之鱼也 在 default 那一区块有处理,不管是 error handling 还是 return default, 而且所有的状况在 if-else 结构内都会 return,能轻易判断函式终结点。 2. float 运算时,不管是比大小还是运算,最好两边都是 float (10.0f), 你有些写 int,问题倒还不大反正会转成 float,但有些写 double (2.50) 就 会两边都转成 double 运算,运算完再转 float 再 return,浪费效能。 另一个问题点,你大概一开始把 unit 定义为 int 後来才改 float, 所以 if 里面完全没有处理到 10.0f<unit<11.0f, 50.0f<unit<51.0f 的状况, 如果习惯把常数的 data type 也写对,遇到可能有问题的状况,心中自然会产生 违和感,觉得这样写怪怪的。你写 10.0f 时就会考虑 10.5f 会发生什麽事 3. 最後注解 Unreached 其实很有必要,照我的写法所有状况都应该在 if-else 的 结构内 return,所以不会跑到 Unreached 那边。但就是有些人在修改 code 时 会呆呆加在後面,以为 if 跑完就会跑他加的东西,所以要注解提醒。 实务上有很多地方需要这样的防呆措施,不只是合作写程式防别人耍呆,很多 时候自己也会发蠢, * * * 举另一个经典例子: if (unit > 1.0f) return unit*3.0f; 这样写在 C/C++ 是允许的,省略大括号。但是就有人这样插一行... if (unit > 1.0f) printf("Using 3.0 ratio.\n"); return unit*3.0f; 结果变成不管 unit 值多少,有没有 print 那行字,都变成 return unit*3.0f 了 所以我会严格要求如果 if 的内容分成两行写,一定要加大括号 if (unit > 1.0f) { return unit*3.0f; } 或这样也行 if (unit > 1.0f) { return unit*3.0f; } 写成同一行的话随便你加不加 if (unit > 1.0f) return unit*3.0f; 大家应该会觉得是插入新行却不长眼看清楚的那个人的错,我也觉得是他的错, 但是这种状况实在太多太多了,大家都是用 Ctrl-C & Ctrl-V 在写程式的样子, 熬夜拼命贴的时候就常常贴错地方,只好设法定一些规则防呆。 这样至少你 code review 时就可以检查大括号来预防出错,而不是每次 release 的 前一天晚上才在抓几百个这种无脑错误。 -- 桃乐丝: 可是, 如果你没有头脑, 为什麽会说话? 稻草人: ㄝ, 我也不知... 但是有些人没有头脑也能说超~多话呢。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.164.198.178
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1461828217.A.029.html
1F:→ MOONRAKER: else if 不错,清楚要求只有一个case执行 04/28 15:55
2F:→ MOONRAKER: 也有人要求很长很大的if block不要用else 04/28 15:55
3F:→ MOONRAKER: 而是要 if (flag) { ... } if (!flag) { ... } 的 04/28 15:55
4F:→ MOONRAKER: 不过那是另外一回事情 04/28 15:56
5F:推 james732: 推 04/28 20:11
6F:推 CoNsTaR: 用 monads 来写最方便啦 XDD 04/29 12:42
7F:→ bibo9901: monad是个糟糕的设计 04/29 13:09
8F:推 CoNsTaR: 是啊 它隐藏了不该隐藏的细节 可是就是方便嘛 XDD 04/29 13:13
9F:→ bibo9901: C又没有绑手绑脚的"纯"函数 跟本不必用monad啊 04/29 13:15
10F:推 chen20: 推推 04/29 21:59
11F:推 david830317: 我是原PO谢谢大大的建议跟详细的讲解!! 05/23 13:12







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灯, 水草

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

TOP