首先得知道&&进行的是短路运算,如果运算符的左边经计算后结果为假,则不会再计算右边。
因a*b=2为真,接着计算(b++,!c),而(b++,!c)是一个逗号表达式,逗号表达式按从左往右计算,整个表达式的结果为最右边那个表达式的结果。所以,(b++,!c)经计算后为(2,0),逗号表达式的值是0,同时b为3,而a*b&&(b++,!c)&&(a++,c++)=2&&0&&(a++,c++)已为假,不会再计算(a++,c++),因此,结果是表达式a*b&&(b++,!c)&&(a++,c++)的值是0,该表达式运算过后,a=1,b=3,c=3。
该表达式运算过后,a=1 ,b=3 ,c=3
因为 1*2的值非0,被认为是“真”
&&后面继续计算:b++,!c
是一个逗号表达式,b变成了3,!c的值为0(因为c原值为非0,即“真”,取反后即为“假”),所以逗号表达式的值为“假”。
整个表达式的值已经确定,为“假”,后面总分不再运算。
所以,a=1 ,b=3 ,c=3
看结果就知道了 执行了第一个括号之后就返回了 后面的括号没有执行
第一个括号最后一个值是!c c逻辑取反运算 c是3 取反后是0 然后逗号表达式返回最后一个值 返回了0 前面的&&遇到0就直接返回结果了
根据运算符的优先级,表达式等价于
(++a) || (-b) && (++c)
在C/C++中 0为false,非0就是true,上面的表达式就等于
true || true && true
所以最终的值就是true,如果按照整数输出,则为1