简单的 C++ for 循环意外输出
simple c++ for loop unexpected output
我一直在编写一个程序,它要求您输入两个整数,然后列出从输入的两个整数中较小的一个到输入的两个整数(包括(中较大的一个的所有整数。 我希望程序在输出中的最后一个整数之后放置一个句点,并且我已经找到了不使用 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;
}
- 字符串比较中的意外输出
- 来自 decltype 的意外输出类型
- 字符数组到十六进制字符串的转换 - 意外输出
- 使用 boost::regex 从目录中获取带有一些正则表达式的文件名称时出现意外输出
- 使用后序遍历递归的深度优先搜索会产生意外输出
- C++的意外输出
- 贝金纳C++练习解决方案的意外输出
- 无效* 转换获得意外输出
- 以下程序的意外输出
- 意外输出:矢量矢量(功率集)
- 基本 int 数组提供意外输出
- 线程的意外输出
- 减法中的意外输出
- 带有左移操作员C 的意外输出
- C strncpy意外输出
- 意外输出..函数绑定在虚拟表中的发生方式
- 星号的意外输出
- 已编译的 protobuf 文件的意外输出路径
- 打印对象矢量的意外输出
- 递归函数用于计算 n 个数字之和的意外输出