C语言中的异常数学运算

C语言中的异常数学运算,c,C,我在某个地方发现了这个问题,不明白。请帮我解决这个问题 #include<stdio.h> int main(){ char x = 250; int ans = x + !x + ~x + ++x; printf("%d", ans); } #包括 int main(){ 字符x=250; int ans=x+!x+~x+++x; printf(“%d”,ans); } 输出结果是-6。我不明白编译器是如何执行操作的 提前谢谢 当你试

我在某个地方发现了这个问题,不明白。请帮我解决这个问题

#include<stdio.h>

    int main(){

    char x = 250;

    int ans = x + !x + ~x + ++x;

    printf("%d", ans);


}
#包括
int main(){
字符x=250;
int ans=x+!x+~x+++x;
printf(“%d”,ans);
}
输出结果是-6。我不明白编译器是如何执行操作的


提前谢谢

当你试图理解这样的事情时,将问题分解成更小的部分并逐一查看通常是有帮助的。我修改了您的程序,以便它打印每个值:

#include<stdio.h>

int main(){

    char x = 250;

    printf("x:   %d\n", x);
    printf("!x:  %d\n", !x);
    printf("~x:  %d\n", ~x);
    printf("++x: %d\n", ++x);

    int ans = x + !x + ~x + ++x;

    printf("ans: %d\n", ans);
}

一旦你理解了每个部分的含义,就更容易看到它们是如何组合成最终结果的。但是,我的编译器也发出警告,因为
++x
在其他地方使用
x
的同一表达式中修改
x
,并且更改术语的求值顺序将更改最终结果。

如果
char
被签名,请注意,
250
超出范围,但可能是
-6
。但是没有序列点的
++x
会导致未定义的行为。尽管此建议很有用,但您的回答给人的印象是,混合操作描述了已定义的行为。它不会(至少当组合不规则时不会)。
x:   -6
!x:  0
~x:  5
++x: -5
ans: -5