【问题标题】:Assigning and Conditional Testing Simultaneously in C++在 C++ 中同时分配和条件测试
【发布时间】:2011-04-13 19:24:14
【问题描述】:

我有三个返回整数错误代码的函数,例如

int my_function_1(const int my_int_param);
int my_function_2(const int my_int_param);
int my_function_3(const int my_int_param);

为了简洁起见,我想同时分配和测试错误。以下内容是否可以使用并且可以移植?

int error=0;
...
if ( error ||
     (error = my_function_1(val1) ||
      error = my_function_2(val2) ||
      error = my_function_3(val3)) ) {
   std::cout << "AN ERROR OCCURRED!!!" << std::endl;
}

谢谢!

【问题讨论】:

  • error = my_function_1(val1) -> 将始终评估为 true 。
  • 即使error的值为0?
  • 你真的想让它难以阅读吗?它让我尖叫。
  • @DumbCoder:如果函数返回零,则不会。
  • 好吧,我正在处理一个相对冗长的文件 io 进程,所以任何减少我的代码长度的方法在我看来都是好的。为什么你认为这很丑?我的问题是它是否有效。如果它有效并且您了解该语言的工作原理,那么弄清楚它的作用不应该是微不足道的吗?这对我来说并不过分复杂......

标签: c++ conditional variable-assignment evaluation conditional-operator


【解决方案1】:

error 被初始化为0。因此&amp;&amp; 将始终计算为false。所以if 条件的其他部分永远不会被评估。所以这段代码不起作用。如果您删除 &amp;&amp; 条件,代码应该可以移植,因为标准保证了这种情况下的评估顺序。

【讨论】:

  • 好点。我将其更改为或。对于那个很抱歉。我只是在其中包含初始错误条件,以测试是否发生了先前的错误。现在的说法正确吗?
  • 是的..现在有意义了..if 仅当方法之一返回非零值时才会输入条件。
【解决方案2】:

我不明白为什么你在函数的开头有error &amp;&amp;,但其余的应该做你想做的事。标准保证|| 运算符的短路评估。不过我会认为它的风格很糟糕。

编辑:根据您的评论,您需要将error &amp;&amp; 替换为error ||。我还要补充一点,这是使用异常而不是错误代码的一个很好的理由,它使您的代码更易于阅读。

【讨论】:

  • 如果发生了先前的错误(即,如果发生错误,请不要进行这些函数调用...),我可以将其短路。那是不是很糟糕的风格?
  • @Jason- 如果有人要问你为什么要写这样的代码,那很可能是不好的风格。编写良好的代码应该易于阅读和理解。因此,简洁并不总是 C++ 代码的良好品质。为什么不打印出函数本身内部的错误消息?如果这是您在错误情况下所做的唯一不同的事情,那么这段代码将变得更加简单和可读。
  • 不,还有更多...我还需要将所有以后的文件 io 逻辑短路。至于它的风格是否糟糕,我基本上是自学了 C++,所以我想我的风格很糟糕!有什么建议的资源吗?除了在堆栈溢出上窃听别人吗? :P
【解决方案3】:

为什么不抛出异常?

void my_function_1(const int my_int_param);
void my_function_2(const int my_int_param);
void my_function_3(const int my_int_param);

try {
    my_function_1(...);
    my_function_2(...);
    my_function_3(...);
} catch(std::exception& e) {
    std::cout << "An error occurred! It is " << e.what() << "\n";
}

【讨论】:

  • 我会在哪里抛出异常?通过在我的函数调用后添加条件?还是在函数内部?
  • 函数本身的内部。存在异常是因为错误代码很糟糕。当您遇到错误时,您只需throw std::runtime_error("some error string")。您不必处理错误代码或任何类似的废话。
  • 好主意。我可能会修改代码以使用异常。 PS,您是这里更有帮助且不那么刻薄的评论者之一。有些人(即下面的 Mark Ransom)似乎无法在不插入讽刺/讽刺的情况下回答自学/初学者的认真问题。当然,我理解人们想告诉你你的编码风格是否很差,但至少解释一下原因。感谢您提供信息丰富且直截了当的回答,并希望其他人会跟随您的领导......
【解决方案4】:

是的,在将&amp;&amp;|| 进行细微更改后,它将起作用。但这太令人困惑了(在测试中使用= 令人困惑)并没有太多好处。

您可以使用另一张海报建议的exception 行,或者简单地将您检查的代码放入函数中并执行以下操作。

int checked(){
    int error = 0;
    error = my_function_1(val1); if (error) return error;
    error = my_function_2(val1); if (error) return error;
    error = my_function_3(val1); if (error) return error;
    return error;
}

我相信任何程序员都会很容易理解这里做了什么。

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 2011-02-03
    • 2014-03-14
    • 2012-07-09
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多