条件运算符“? :“

我昨天在C完成了编程考试。 有一个问题我无法回答,即使我今天研究过,我也无法提出解决方案。

所以我们有这个:

int A= -1 , B= -2, C= -3, X=1; X = B != C ? A=(~C) - A-- : ++C + (~A); printf("A= %d B= %d C =%d X=%d \n", A,B,C,X); 

我知道如果X = B != C为真,则此运算符起作用,然后执行A=(~C) - A-- 。 如果为假,则执行++C + (~A)

任何人都可以告诉我并解释printf中A,B,C和X的值是什么?

这包含在一个问题中,要求对整个程序进行“跟踪”:

  #include  void main(){ int A= -1 , B= -2, C= -3, X=1; X = B != C ? A=(~C) - A-- : ++C + (~A); printf("A= %d B= %d C =%d X=%d \n", A,B,C,X); if(~A){ printf("\n out1\n"); C= A | B printf("A= %d B= %d C =%d X=%d \n", A,B,C,X); C= C <>1 printf("A= %d B= %d C =%d X=%d \n", A,B,C,X); 

顺便说一句,任何人都可以告诉我, if条件是什么意思?

该声明

 X = B != C ? A=(~C) - A-- : ++C + (~A); 

相当于

 if(B != C) X = (A = (~C) - (A--)); else X = ++C + (~A); 

因此,表达式A = (~C) - (A--)调用未定义的行为。 在这种情况下,没有任何好处可以预期。

也就是说,这是一个错误的问题,不应该在考试中提出。 或者只要一个选项声明代码将调用未定义的行为 ,就可以询问多选答案。

这个问题永远不应该在考试中,因为它包含未定义的行为。

具体来说,这个赋值A = (~C) - A--修改A两次 – 在--复合赋值中,以及赋值本身。 由于两者之间没有序列点 ,因此行为未定义。

注意:这并不意味着程序不会打印任何内容。 它肯定会在大多数平台上产生一些输出。 但是,这一切都不重要,因为C程序完全无效:它可以产生它选择的任何输出,不产生输出,甚至崩溃。

为什么不给你的老师一个惊喜,给出正在发生的事情的详细解释;)

  ... mov eax, dword ptr [rbp - 16] ; get C xor eax, -1 ; negate C mov ecx, dword ptr [rbp - 8] ; get A mov edx, ecx ; put A into edx add edx, -1 ; add -1 to edx => A-- mov dword ptr [rbp - 8], edx ; store result inside A sub eax, ecx ; substract from ~C what was the result of A-- mov dword ptr [rbp - 8], eax ; store it inside variable A ...