2016-03-31 109 views
-1

如果我沒有if語句,循環可以正常工作,但是一旦添加它,代碼就不再運行。建設時沒有問題。我可以說我運行它時沒有初始化repNum在IF語句中添加時出錯

的代碼如下:

#include<iostream> 
using namespace std; 

int main() 
{ 
    int repNum; 
    int prodSold; 
    int prodPrice; 
    int repTotal; 
    int numReps = 0; 
    if (repNum >0 && repNum < 21) 
    { 
     for(int numReps = 0; numReps <= 20; numReps ++) 
     { 
      cin >> repNum; 
      cin >> prodSold; 
      cin >> prodPrice; 
      repTotal = prodSold * prodPrice; 
      cout << "Agent #" << repNum << " sold " << prodSold << " packages at $" << prodPrice << 
       " for a dollar value of $" << repTotal << endl; 
     } 
    } 
    else 
    { 
     cout << "***Invalid Agent***" << endl; 
    } 
} 
+0

爲什麼你沒有初始化repNum?你必須讓它工作。 –

+0

其他人都診斷出您的問題。但是另外,你已經聲明瞭'numReps'的兩個單獨的副本。這不會在這裏造成問題,但如果您不花時間理解它,它將在您將來的代碼中出現。因爲'numReps'已經被聲明瞭,'for''循環應該開始'for(numReps = 0; ...' – TonyK

回答

2

當執行條件if (repNum >0 && repNum < 21),可變repNum仍然未初始化的,這就是爲什麼你會得到錯誤。

0

您應該初始化repNum。否則,你不能比較repNum大於0,因爲repNum沒有價值。如果你想這樣,只需設置repNum -1
順便問一句if語句中的repNum只會讓你感覺到它的值來自程序的另一個點。你在這裏是否缺少代碼?

0

非靜態變量的非初始化會導致變量可能被分配一些垃圾值。

在你的情況下,你還沒有初始化repNum,這可能會分配一些垃圾值。然後,您繼續檢查這個垃圾值是否與if語句中的某個表達式相關,這可能會導致未定義的行爲。

1

你被using an unitialised variable遇到未定義行爲:

int repNum; 
if (repNum >0 && repNum < 21) 

repNum從未用值初始化!你需要給它一個價值。

int repNum = 0; 

你也應該考慮使用auto因爲它會迫使你把它初始化爲一個值:

auto repNum = 0u; 

如果您嘗試以下

auto repNum; 

你會得到一個編譯錯誤。

就目前而言,編譯時應該會收到警告。如果你打開你的編譯器警告設置,你應該得到這個警告。

0

正如你所說這是一個單變量變量問題。在這種情況下,您可以使用do while進行if檢查。因此,使用do while從用戶獲取所有變量的輸入,然後當條件被接受時,您有權使用for循環。

假設你希望得到有效的輸入20次:

int i = 0; 
do 
{ 
    cin >> repNum; 
    if (repNum >0 && repNum < 21) 
    { 
     for(int numReps = 0; numReps <= 20; numReps ++) 
     { 
      cin >> prodSold; 
      cin >> prodPrice; 
      repTotal = prodSold * prodPrice; 
     } 
     i++; 
    } 
    else 
    { 
     cout << "***Invalid Agent***" << endl; 
     i--; 
    } 
} while (i < 20); 

您可能要檢查i是在else情況下爲負值。如果i < 0是不可接受的,你可以使用你喜歡的任何錯誤處理。