奇怪的C程序前缀增量行为与Javascript

时间:2018-03-06 20:27:21

标签: javascript c

我正在运行这个简单的代码段:

#include<stdio.h>

int main() {
    /*m = -1
    i = -1
    j = 3
    k = 0*/

    int i = -2, j = 3, k=0, m=0;
    m = ++i || (++j && ++k);
    printf("%d, %d, %d, %d", i, j, k, m);
}

enter image description here

我的理解是m = ++i会在此处停止,不会进一步评估i = m = -1的值。但是,m的值为1!

我在JavaScript中尝试了相同的代码,m的值在这里是infact -1。 C代码有什么问题?

enter image description here

2 个答案:

答案 0 :(得分:8)

在C中,逻辑OR运算符||如果两个参数都计算为0则结果为0,如果任一参数计算为非零,则结果为1。

在这种情况下,++i的计算结果为-1,因此不评估||的右侧,运算符的结果为1.

Javascript以不同方式处理||运算符。特别是,如果计算结果为true,则会产生左操作数,否则会产生右操作数。因此,您不能指望运算符在一种语言中以与在另一种语言中相同的方式工作。

答案 1 :(得分:1)

由于运算符||的结果,

m被赋值为1是类型_Bool,并且赋值右侧的表达式为true,在这种情况下,它被转换为整数值1。