2012-01-14 129 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; 
}