大佬教程收集整理的这篇文章主要介绍了c – 逗号运算符,return语句和nullptr没有副作用?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <cstdint> #include <Cassert> enum class Result : std::uint32_t {succesS = 0,INsuccesS = 1}; void* func(Result& result) { // works great /* result = Result::INsuccesS; return NULL; */ // error: invalid conversion from ‘long int’ to ‘void*’ [-fpermissive] /* return result = Result::INsuccesS,NULL; */ // compiles,but <result> is not set??? return result = Result::INsuccesS,nullptr; } void testReturnWithSideEffects() { Result result = Result::succesS; func(result); assert(result == Result::INsuccesS); }
这里有两个问题但我对@R_489_8315@最感兴趣:
为什么没有设置结果?
编辑:
感谢大家的确认.我决定使用的解决方法是替换:
return result = Result::INsuccesS,nullptr;
以下内容:
return result = Result::INsuccesS,(void*)NULL;
附加说明:当然我的生产场景是另一种指针类型(不是void *),但为了说明的目的我进行了简化.
另一个注意事项:从解决方法中你可以看出,这个nullptr有一些可疑的东西.我猜测不编译的示例行应该实际编译,并且这两个问题可能以某种方式相关.
和第三和最后一点,那些谁介绍的“挂羊头卖狗肉”或者我的代码“不可读性”:可读性在很大程度上是一个主观的问题,比如我可以说,这样的简写可以使代码更有条理这实际上可以帮助现货缺陷.
return result = Result::INsuccesS,nullptr;
看起来像一个gcc bug,如果我将return语句更改为this(@L_616_12@),它似乎在return语句的上下文中忽略了逗号运算符的左侧:
return (printf("Hello\n"),nullptr);
没有输出,但如果我们在return语句之外执行此操作,则会得到预期结果.它看起来固定在4.8但我可以用4.6和4.7重现.
如果我们看一下draft C++ standard部分5.18 Comma运算符,它说(强调我的):
无论如何,正如几个人已经提到的那样,这段代码很聪明但难以阅读,因此难以维护,将其拆分为两行也能正常工作.我总是想记住这个quote from Brian Kernighan(可能还有其他几个版本):
对于第一种情况,如果我们查看4.10节指针转换(错过我的未来),则错误是有效的:
表达方式:
result = Result::INsuccesS,NULL
不是一个常量表达式,因为它包含=,5.19常量表达式中包含什么是常量表达式,并说:
包括:
使用Nullptr是可以的,因为它是std :: nullptr_t的prvalue,我们可以从12.14.7节指针文字看到:
以上是大佬教程为你收集整理的c – 逗号运算符,return语句和nullptr没有副作用?全部内容,希望文章能够帮你解决c – 逗号运算符,return语句和nullptr没有副作用?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。