在 C++ 中同时分配和条件测试

发布于 2024-09-19 17:06:21 字数 474 浏览 10 评论 0原文

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

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;
}

谢谢!

I have three functions that return integer error codes, e.g.

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);

I want to assign and test for error at the same time for brevity. Will the following work and be portable?

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;
}

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

请爱~陌生人 2024-09-26 17:06:21

为什么不抛出异常呢?

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";
}

Why not throw an exception?

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";
}
命比纸薄 2024-09-26 17:06:21

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

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

I don't understand why you have the error && at the beginning of the function, but the rest should do what you want. Short circuit evaluation of the || operators is guaranteed by the standard. I would consider it bad style though.

Edit: Based on your comment, you would need to replace error && with error ||. I will also add that this is a good reason to use exceptions rather than error codes, it makes your code so much easier to read.

梦断已成空 2024-09-26 17:06:21

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

error is initialized to 0.So the && will always evaluates to false. So other parts of the if condition are never evaluated. So this code will not work. If you remove the && condition the code should work portably as the standard guarantees the order of the evaluation in this case.

迷你仙 2024-09-26 17:06:21

是的,在 &&|| 进行细微更改后,它就会起作用。但它太混乱了(在测试中使用 = 很混乱),没有太多好处。

您可以选择另一张海报建议的 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;
}

我相信任何程序员都会很容易理解这里所做的事情。

Yes, after the minor change of && with || it will work. But it's just too confusing (using = in tests is confusing) with not much benefit.

You could go for exception line another poster suggested, or simply put your checked code inside function and do like below.

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;
}

I believe any programmer will easily understand what is done here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文