【问题标题】:Why does results are different when relational operators means the same?当关系运算符的含义相同时,为什么结果会不同?
【发布时间】:2020-05-14 16:24:08
【问题描述】:

为了清楚起见,让我们考虑以下程序:

#include <iostream>

int main(void) {
    short int i; // declaration
    short int value;
    short int sum;

    i = value = sum = 0; // initialization

    std::cout << "Enter a value: ";
    std::cin >> value;

    while (i != value) { // ### here's the confusion ###
        sum += i;
        i++;
    }

    std::cout << "Total sum: " << sum << std::endl;

    return 0;
}

while (i != value),当给出这个表达式时,结果显示Total sum: 45,而如果我们输入while (i &lt;= value),结果显示Total sum: 55。 (例如输入10

这里的困惑是,我们什么时候应该在循环中使用!=&lt;= &gt;= 操作,任何特定条件?

根据TutorialsPoint's Operators Reference

  • 它告诉!=(返回true,当两个操作数不相等时使用)。
  • &lt;=(当我们需要确定第一个操作数是否小于或等于第二个时,返回true)。

预计输出不会有任何差异,但有些地方被误解了。

【问题讨论】:

  • 在调试器中单步执行并找到执行与您期望的差异的确切比较。
  • 您的要点清楚地表明它们等效。当i=5num=5 时会发生什么?
  • 顺便说一句,没有理由使用short int。通常int 类型是处理器寄存器的大小,处理器针对该数据大小进行了优化。例如,short 可以是 16 位,这对于只获取 32 位的处理器来说会很烦人。如果您想要 16 位数量,请使用 uint16_tint16_t

标签: c++ while-loop operators


【解决方案1】:

这个while循环

while (i != value)

不包括 i 等于 value 时的迭代,因为在这种情况下,条件 i != value 的计算结果为 false。

这个while循环

while (i <= value)

包括 i 等于 value 时的迭代,因为在这种情况下,条件 i

其实第一个条件可以改写成如下方式(前提是初始i小于值)

while ( i < value )

现在将它与第二个循环中的条件进行比较,然后可以像这样重写

while ( i < value || i == value )

那就是你有两个不同的条件。

【讨论】:

    【解决方案2】:

    while( i <= value) 
    

    最后一次迭代是i == value。与

    while ( i != value) 
    

    i == value 时不会执行循环体。这就是你观察到差异的原因。

    这是学习如何使用调试器的好机会。和/或意识到你的例子已经太复杂了,无法直接看到发生了什么。使用

    ,您会更容易发现差异
    int i = 0;
    int value = 5;
    while ( i != value) {
        std::cout << i << " ";
    }
    i = 0;
    while ( i <= value) {
        std::cout << i << " ";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-11
      • 2011-08-11
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多