c - C 中严格从左到右求值

标签 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,因此它将在第二个位置处理运算符并获取索引 1 和 3 处的操作数。这是错误的,因为它们很可能未初始化。将 j 增加 2 会以某种方式解决(或者更确切地说是一种解决方法)问题。

在第一个循环中,不能保证输入将按操作数-操作符-操作符-操作符-操作符-...的顺序出现,更糟糕的是,i++else 中做什么 block 是什么意思?这会完全搞砸事情,因为它会在两个数组中腾出额外的空间,这将完全混淆第二个循环。如果您完全删除此 else block ,并且您提供了预期的输入,则代码可能会正常工作。

而是考虑某种方式来验证输入,即使进行了上述修复,仍然存在很多限制,例如您只能提供单个数字作为操作数等。

关于c - C 中严格从左到右求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35860863/

相关文章:

c - 为什么导出的由另一个驱动程序修改的常量值未在原始驱动程序中更新

c - 在编译以下代码时编译器显示警告

c - 调用函数时一些数据从指针中消失

C - 使用指针向上移动数组元素

c - 在 Raspberry PI 3 上的 C++ 中达到超时后如何清除 select() 状态

使用可变参数计数调用 C 函数

c - C语言中的pipe 2 linux命令

c++ - 在包裹的命令行中//之后解开空间

c - 如何将宏函数作为参数传递

c - 弹性 Bison : Building C Compiler - Line number in error message