【问题标题】:"if" statement in c++ doesn't evaluate conditions from left to rightC++ 中的“if”语句不会从左到右评估条件
【发布时间】:2018-10-03 06:33:29
【问题描述】:

我指的是问题“"IF" argument evaluation order?”以了解 c++ 中“if”语句的评估顺序。

这是 if 语句中的条件以错误顺序计算的代码。

#include <iostream>

using namespace std;

int main()
{
    int t = 0;
    if((1 / t) == 1 && t != 0)
    {
        cout << "0" << endl;
    }

    cout << "1" << endl;

    return 0;
}

结果是 1 而不是浮点异常。

【问题讨论】:

  • 那么,如果你在 if 之外运行 1/t,你会得到一个 FP 异常吗?
  • 是,但不在 if 条件下
  • 您是否检查过该代码的生成程序集?我猜编译器注意到 t 等于 0 并完全跳过了条件。再次检查 t 从 cin 读取。
  • 我建议你使用不同的方式来检查评估的顺序。
  • if 不必评估其条件(复数);它有正好一个条件。现在这个表达式可能有子表达式,但这不是if 关心的问题。 if 只计算最外层的值,可能会将其转换为 bool。

标签: c++ c++11 c++14 integer-division divide-by-zero


【解决方案1】:

除以零是未定义的行为。任何事情都有可能发生。

[expr.mul]/4

如果 / 或 % 的第二个操作数为零,则行为未定义。

【讨论】:

【解决方案2】:

除以零并不能保证每次程序都会抛出运行时错误。这就是为什么除以零是一种未定义的行为。

如 C 标准所述;

/ 运算符的结果是第一个操作数除以第二个操作数的商; % 运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。

对于 C++ (03-5.6.4);

二元 / 运算符产生商,二元 % 运算符产生除法的余数 第二个表达式的第一个表达式。如果 / 或 % 的第二个操作数为零,则行为未定义;否则 (a/b)*b + a%b 等于 a。如果两个操作数都是非负数,则余数是非负数; 如果不是,余数的符号是​​实现定义的

【讨论】:

  • 这是 C++,不是 C。C++ 规范中的文字可能是相同的,但您的答案是指 C 而不是 C++。
  • @Mast 我的回答是指 c 和 c++,尽管我承认引用了 c 标准
  • 是的,所以我建议更改文本以包含 C++。
猜你喜欢
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多