2016-03-08 41 views
0

評價我在我的for循環中有一個問題,val被打印出來作爲垃圾數據。我想知道是否這是因爲當我做num[(j+1)]它實際上遞增變量J,如果是的話如何增加下一個元素而不影響for循環變量?嚴格從左至右在C

while ((scanf("%c",&userIN) == 1) && (userIN != '\n')) { 
    if(userIN >= '0' && userIN <= '9') { 
     num[i] = (userIN-'0'); 
    } 
    else if ((userIN == '+')||(userIN == '-')||(userIN == '/')||(userIN == '*')) { 
     ops[i+1] = userIN; 
    } 
    i++; 
} 


for (j = 1; j <= i; j+2) { 
    if (ops[j] == '+') { 
     k = j; 
     k++; 
     num[k] = ((num[j]--) + (num[j]++)); 
     printf("\n%d",(num[j]--)); 
     val = num[k]; 
    } 
    else if (ops[i] == '-') { 
     k = j; 
     k++; 
     num[k] = ((num[j]--) - (num[j]++)); 
     val = num[k]; 
    } 
    else if (ops[j] == '/') { 
     k = j; 
     k++; 
     num[k] = ((num[j]--)/(num[j]++)); 
     val = num[k]; 
    } 
    else if (ops[j] == '*') { 
     k = j; 
     k++; 
     num[k] = ((num[j]--) * (num[j]++)); 
     val = num[k]; 
    } 
} 
+0

「當我做NUM [ (j + 1)]其實際增量J變量「爲什麼不張貼代碼來增加變量?注意不要導致[未定義的行爲](http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior)! – MikeCAT

+0

當輸入流用完時,'scanf'返回'EOF',這是一個負值。在有條件的情況下,這被認爲是真實的。 (while(scanf(「%c」,&userIN)== 1 && ...)'''更好的是,使用'getchar'而不是'scanf(「%c」,...)'。 –

+2

你的問題與'j'變量的一些神奇的,不可見的增量無關。它們都是由不瞭解算法,也不是你自己的代碼造成的。從程序員不再理解他們自己的代碼的時候起,程序就沒有什麼好處了。在最後一次編輯時,問題和代碼都不再有任何意義。 – Lundin

回答

1

該循環通常是非常錯誤的。實際上兩個循環。

在第二個循環中,您可能期望讀取的第二個元素是運算符,並且在那裏有操作數。但增量部分只增加一個,所以它會在第二個位置處理運算符,並在索引1和3處取操作數。這是錯誤的,因爲它們很可能是未初始化的。以2增加j會以某種方式解決問題(或者更確切地說是解決方法)。

在第一個循環是沒有保證的輸入會爲了操作,操作員操作的操作員操作數-...更糟糕的是,這是什麼i++else塊是什麼意思?這將徹底搞砸事情,因爲它會在兩個陣列中增加額外的空間,這將完全混淆第二個循環。如果您完全刪除此else區塊,則如果您提供預期輸入,則代碼可能會有效。

反倒是考慮一些辦法如何驗證輸入,甚至與上面的修復仍存在不少限制,例如像你只能提供單一的數字作爲操作數等

+0

當我試圖增加2,程序只是掛,好像我從來沒有達到'\ n',只是試了一遍,同樣的問題如果我把它作爲++它運行良好(錯誤的輸出),但j + 2只會掛起 –

+1

@AlexPurpleHosein:'j + = 2'是正確的增量方式。 –