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

奇怪的C程序前缀增量行为与Javascript,javascript,c,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); } 我的理解是,m=++我将在这里停止,不再进一步求值,所以i的值=m的

我正在运行以下简单的代码片段:

#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);
}
我的理解是,m=++我将在这里停止,不再进一步求值,所以i的值=m的值=-1。但是,m的值是1

我在JavaScript中尝试了相同的代码,这里m的值实际上是-1。C代码怎么了


在C语言中,如果两个参数的计算结果均为0,则逻辑OR运算符| |的结果为0;如果任一参数的计算结果均为非0,则逻辑OR运算符的结果为1

在本例中,++i的计算结果为-1,因此不计算| |的右侧,运算符的结果为1


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

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

在本例中,++i的计算结果为-1,因此不计算| |的右侧,运算符的结果为1


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

m被赋值为1,因为运算符| |的结果是类型化的| Bool,而赋值右侧的表达式为true,在这种情况下,它被转换为整数值1

m被赋值为1,因为运算符| |的结果被类型化为_Bool,赋值右边的表达式为true,在这种情况下,它被强制转换为整数值1

您使用的是前缀递增运算符,它先递增值,然后赋值。@hafeez我知道这一点。这就是为什么我最后说I=m=-1你的理解是错误的。Javascript的表达式求值规则与C完全不同。C代码有什么问题?没什么@GrigoryRechistov我来自JavaScript背景,所以对我来说-1 | |有些东西是-1而不是1。我忽略了一个事实,即C将首先隐式地将布尔结果转换为一个数字。您使用的是前缀递增运算符,它先递增值,然后赋值。@hafeez我知道这一点。这就是为什么我最后说I=m=-1你的理解是错误的。Javascript的表达式求值规则与C完全不同。C代码有什么问题?没什么@GrigoryRechistov我来自JavaScript背景,所以对我来说-1 | |有些东西是-1而不是1。我忽略了一个事实,即C将首先隐式地将布尔结果转换为数字。哦!!来自JavaScript背景,我假设-1 | |某物是-1。但C将其转换为布尔值。谢谢你的澄清。哦!!来自JavaScript背景,我假设-1 | |某物是-1。但C将其转换为布尔值。谢谢你的澄清。int,不是。int,不是。