C 这三个问题相似但不相同。怎样?

C 这三个问题相似但不相同。怎样?,c,logical-operators,C,Logical Operators,问题1:产出 int main() { int i=-3, j=2, k=0, m; m = ++i && ++j || ++k; printf ("%d %d %d %d", i,j,k,m); return 0; } int main() { int i=-3, j=2, k=0, m; m = ++i || ++j && ++k; printf ("%d %d %d %d", i,j

问题1:产出

int main() { 
    int i=-3, j=2, k=0, m; 
    m = ++i && ++j || ++k; 
    printf ("%d %d %d %d", i,j,k,m); 
    return 0; 
} 
int main() { 
    int i=-3, j=2, k=0, m; 
    m = ++i || ++j && ++k; 
    printf ("%d %d %d %d", i,j,k,m); 
    return 0; 
} 
int main() { 
    int i=-3, j=2, k=0, m; 
    m = ++i && ++j && ++k; 
    printf ("%d %d %d %d", i,j,k,m); 
    return 0; 
}
问题2:产出

int main() { 
    int i=-3, j=2, k=0, m; 
    m = ++i && ++j || ++k; 
    printf ("%d %d %d %d", i,j,k,m); 
    return 0; 
} 
int main() { 
    int i=-3, j=2, k=0, m; 
    m = ++i || ++j && ++k; 
    printf ("%d %d %d %d", i,j,k,m); 
    return 0; 
} 
int main() { 
    int i=-3, j=2, k=0, m; 
    m = ++i && ++j && ++k; 
    printf ("%d %d %d %d", i,j,k,m); 
    return 0; 
}
问题3:产量

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

请解释此操作是如何工作的?

布尔操作是从左到右处理的(无括号…)。一旦结果被修复,它就会停止对其余条件的评估。这意味着:

false && (AND) -> is always false, no matter what
true || (OR) -> is always true, no matter what

first case stops @ || (because true && true || doesn't matter)
second case stops @ || (because true || doesn't matter && how much && operations ...)
third case stops @ end (because true && true && -> still have to check because if there would be false, the whole expression would be false)
当它在特定点停止时,++操作符不会对剩余的内容执行


这也是为什么你在做一些事情时必须小心的原因,比如递增、递减,或者在某种情况下……

但是请告诉我们你的想法。。我们将一起讨论…源代码有什么不同?你可以根据它做出什么假设?你能解释一切。@Nobilis错了。仅仅因为一个表达式中有多个
++
,它就不是UB。@Nobilis没问题,IIRC我还从堆栈溢出的注释中知道了这一点。+1这应该可以很好地解释它。