繁体   English   中英

条件运算符“? :“

[英]Conditional operator “ ? : ”

我昨天在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 <stdio.h>
            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;}

if(A^B){
         printf("\n out2\n");
        C= B & A
        B += 2
        X= X>>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
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM