2016-03-08 118 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'是正确的增量方式。 –