简单的 C++ for 循环意外输出

simple c++ for loop unexpected output

本文关键字:意外 输出 循环 for C++ 简单      更新时间:2023-10-16

我一直在编写一个程序,它要求您输入两个整数,然后列出从输入的两个整数中较小的一个到输入的两个整数(包括(中较大的一个的所有整数。 我希望程序在输出中的最后一个整数之后放置一个句点,并且我已经找到了不使用 for 循环的方法,但我想了解为什么这段代码不起作用(它只是输出较大的整数后面有一个句点(。

#include <iostream>
int main()
{
std::cout << "Enter two integers, pressing <ENTER> after each integer." << std::endl;
int num1, num2, lower, upper;
std::cin >> num1 >> num2;
if (num1 > num2)
{
    upper = num1;
    lower = num2;
}
else
    if (num1 < num2)
    {
    upper = num2;
    lower = num1;
    }
    else
        if (num1 = num2)
        {
            upper = num1;
            lower = num1;
        }
std::cout << "All integers between " << lower << " and " << upper << " are:" << std::endl;
for (int val = lower; val <= upper; ++val)
{
    if (val = upper)
    {
        std::cout << val << "." << std::endl;
        ++val;
    }
    else
    {
        std::cout << val << std::endl;
        ++val;
    }
}
return 0;

}

如果输入的两个整数是 1 和 5,为什么会输出 5.而不是1 2 3 4 5.

首先,您使用赋值运算符=,您应该在其中使用比较运算符== 。其次,由于 for 循环的第三个语句 (for (...; ...; ++val)(,for 循环已经递增val。因此,无需从循环主体内递增val

此外,考虑到您希望在一行中打印所有结果,您应该在每次迭代后输出一个空格,而不是std::endl .请注意,最后一次迭代是一个例外,因为您需要输出一个句点而不是一个空格。在下面的固定版本中,我在循环体中使用了三元运算符来完成此操作。

std::cout << "Enter two integers, pressing <ENTER> after each integer." << std::endl;
int num1, num2, lower, upper;
std::cin >> num1 >> num2;
if (num1 >= num2)
{
    upper = num1;
    lower = num2;
}
else if (num1 < num2)
{
    upper = num2;
    lower = num1;
}
std::cout << "All integers between " << lower << " and " << upper << " are:" << std::endl;
for (int val = lower; val <= upper; ++val)
{
    std::cout << val << ((val == upper) ? "." : " ");
}

问题是

if (val = upper)
{
    std::cout << val << "." << std::endl;
    ++val;
}

val = 上限表示您影响 val 上限值。输入 2 个 '=',这样它就会比较而不是影响。喜欢这个

if (val == upper)
{
    std::cout << val << "." << std::endl;
    ++val;
}

因为

if(Val = upper)

将 Val 的值重新分配为上限。你的意思是

if(Val == upper)

无论如何,可能就是这样。

++

val 必须只存在于 for 循环声明级别,而不是在 if 和 else 内部

for (int val = lower; val <= upper; ++val)
   std::cout << val << (val==upper ?  "." : " ") << std::endl; 

你的程序中有两个错误,正如delannoyk和Gillaume07都提到的。= 是 C++ 中的赋值运算符,而 == 是比较运算符。所以几乎总是如果语句要有比较运算符。其次,在 for 循环语句和 if/else 中都有增量操作,这将导致每次迭代后计数器变量增加 2。

执行

您所做的更简单的方法是替换它:

for (int val = lower; val <= upper; ++val)
{
    if (val = upper)
    {
        std::cout << val << "." << std::endl;
        ++val;
    }
    else
    {
        std::cout << val << std::endl;
        ++val;
    }
}

有了这个:

for (int val = lower; val <= upper; ++val)
{
     std::cout << val;
}
cout<<"."<<std::endl;

其他人已经对此代码的许多问题发表了评论。这是我的烦恼:您需要检查输入是否正确!也就是说,从std::cin阅读后,您需要检查这是否成功。否则,输入非空格和非数字字符将保留随机垃圾,该垃圾恰好按原样存储在变量中。从std::istream读取的规范方式如下所示:

if (std::cin >> num1 >> num2) {
    ...
}
else {
    possibly an report error here
}
">

="用于将"upper"的值分配给"val"。 在比较"val"和"upper"的值时,要使用的运算符应该是"=="而不是"="。因此,以下代码应为:

if (val == upper)
{
    std::cout << val << "." << std::endl;
    ++val;
}