从左到右严格评估C

时间:2016-03-08 06:52:26

标签: c

我的for循环中出现问题,其中val被打印为垃圾数据。我想知道是不是因为当我做num[(j+1)]它实际上增加了变量J,如果是这样的话,如何在不影响for循环变量的情况下增加下一个元素?

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];
    }
}

1 个答案:

答案 0 :(得分:1)

一般来说,循环是非常错误的。实际上两个循环。

在第二个循环中,您可能希望第二个元素读取是运算符,并且周围有操作数。但是增量部分只增加1,所以它将在第二个位置处理运算符并在索引1和3处获取操作数。这是错误的,因为它们很可能是未初始化的。将j增加2将以某种方式解决(或者更确切地说是解决方法)问题。

在第一个循环中,无法保证输入将按顺序操作数 - 运算符 - 操作数 - 运算符 - 操作数-...更糟糕的是,i++块中else的含义是什么意思?这会完全搞砸事情,因为它会在两个阵列中产生额外的空间,这将完全混淆第二个循环。如果您完全删除此else块,则代码可能会在您提供预期输入时起作用。

而是考虑一些如何验证输入的方法,即使上面的修复仍然存在很多限制,例如你只能提供单个数字作为操作数等。