2012-01-14 132 views
2

我一直在编写一个程序,要求您输入两个整数,然后列出从输入的两个整数中的较小者到所输入的两个整数中较大者(包括整数)中的所有整数。我希望程序在输出中的最后一个整数之后放置一段时间,并且我已经找到了不使用for循环的方法,但我想了解为什么此代码不起作用(它只是输出较大的整数之后的一段时间)。简单C++ 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.

+0

反对使用错误分配,而不是比较的第一道防线是永远永远都使用const对于不改变任何价值。在这种情况下,从std :: cin流式传输之后,num1和num2应该放入const int&Right中。如果分配发生,编译器会警告你。上/下也应该是const,并且可以用最大值和最小值(标准库函数)初始化。例如:const upper = max(num1,num2); – Zoomulator 2012-01-14 15:52:34

回答

3

首先,您正在使用赋值运算符=,您应该在那里使用比较运算符==。其次,由于for循环的第三条语句(for (...; ...; ++val)),for循环已经增加了val。因此,不需要在循环体内增加val

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

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) ? "." : " "); 
} 
+0

谢谢,我没有研究过或者不知道三元运算符或者'='和'=='之间的区别......这非常有帮助。 – lapse 2012-01-14 15:29:59

2

问题是

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

VAL =上意味着你影响到val中的上限值。把2'=',所以它会比较而不是影响。这样

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

由于

if(Val = upper) 

重新分配的Val的值设定为上。你的意思是

if(Val == upper) 

无论如何,这可能是它。

0

++ VAL只能在for循环声明级内部没有如果存在和else

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

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

0

更简单的方法做,你做了什么,有替换此:

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

其他已经就一些与此代码的问题发表了评论。这是我的宠物狗:你需要检查输入是否正确!也就是说,从std::cin读取后,您需要检查这是否成功。输入一个非空格和非数字的字符会使原本存储在你的变量中的随机垃圾保持不变。从得自std::istream读取规范的方法是这样的:

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

“=”被用来指定“上”到“VAL”的值。当比较“val”和“upper”的值时,要使用的运算符应该是“==”而不是“=”。因此,下面的代码应该是:

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