关于返回 void 的文体问题
Posted
技术标签:
【中文标题】关于返回 void 的文体问题【英文标题】:Stylistic question concerning returning void 【发布时间】:2010-11-17 11:21:15 【问题描述】:考虑以下人为的例子:
void HandleThat() ...
void HandleThis()
if (That) return HandleThat();
...
这段代码工作得很好,我很确定它是规范有效的,但我(也许我自己)认为这种不寻常的风格,因为调用似乎返回了函数的结果,尽管事实上两者函数的原型是 void。
通常,我希望看到:
if (That) HandleThat(); return;
我觉得这对正在发生的事情毫不含糊。
SO 社区,对于返回无效的编码风格是否令人困惑或有问题,我能否获得您的意见?它有成语的感觉;我应该使用它还是避免它?
一般来说,我会力求清晰并使用第二种样式。另一方面,第一种形式的简洁性有点吸引我。
【问题讨论】:
如果有任何兴趣,我的实际用法是在某些情况下保释到父类。即: void derivedclass::f(...) if (bail) return parentclass::f(...); ... 【参考方案1】:我同意你的观点,第一种风格令人困惑,因为它暗示某种价值正在被返回。事实上,我不得不读了几遍因为。
当从一个原型为 void 的函数返回时,它应该只是返回;
【讨论】:
+1 我看不出任何人在返回 void 时应该使用第一个约定的充分理由。 同意,后者更直观、更易读——绝对值得多加几个字符。 后者更直观易读。但是,第一个也非常可读,您从中直觉是正确的。所以它不会破坏你的直觉。 @Dave:如果您认为 void 既是一个值又是一个类型,那就对了。我认为它是一种不能包含值的类型。 @Kevin:我的直觉告诉我,第一个约定有点误导。它向我暗示,HandleThat 方法的返回比简单的返回语句更有意义。我的意思是在看到它的最初几秒或几毫秒的上下文中。基于此,我会说第二个约定不太可能引起混淆,因此更易于维护。软件工程师专注于任何一行代码的时间越少,他(/她)必须浏览的数百万行代码越好。【参考方案2】:这可能有点太聪明了。如果该行最终距离函数顶部超过几行,则会令人困惑。这也意味着查看代码的程序员需要关联
return HandleThat();
用void返回类型,在他们真正理解代码之前弄清楚它的聪明之处。当你在 if/else 分支中做不止一件事时,你真的应该使用大括号并将步骤放在不同的行上。占用更多空间但更容易理解:
if (That)
HandleThat();
return;
【讨论】:
【参考方案3】:C 语言规则规定,如果声明为返回 void 的函数尝试返回表达式,则不会计算该表达式。
http://c0x.coding-guidelines.com/6.8.6.4.html
【讨论】:
两种样式生成相同的结果。对于此代码: void a() printf("World!\n"); void b() printf("Hello, ");return a(); 你得到了预期的 Hello World。 我已经通过使用 GCC 4.0 的全面优化和剥离验证了这一点 嗯,有参考吗?据我所知,它是有效的。它很少在模板代码之外使用,但应该是有效的并且函数确实会被评估。反正据我所知。 定义明确,表达式被计算。 [stmt.return] '带有“cv void”类型表达式的return语句只能在返回类型为cv void的函数中使用; 表达式在函数返回其调用者之前被评估。' 嗯,它一定是在某个时候滑入的——这似乎允许它。虽然 C 标准没有类似的规定c0x.coding-guidelines.com/6.8.6.4.html【参考方案4】:以前从未见过。
它的优点是看起来像非 void 返回类型的常用习语,所以它很容易阅读......
除非有人能证明它是无效的,否则我不会更改它。
【讨论】:
【参考方案5】:我相信第一个版本主要是为了简化模板编程。如果 HandleThat 返回的类型 T 可能是也可能不是 void,那么使用第一个版本很方便。
但在“正常”情况下,第二个版本更清晰,我更喜欢那个。
【讨论】:
以上是关于关于返回 void 的文体问题的主要内容,如果未能解决你的问题,请参考以下文章
让springboot序列化空值null为"null"而不是空报文体(jackson)