Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 条件运算符“?”:&引用;_C_Conditional Operator - Fatal编程技术网

C 条件运算符“?”:&引用;

C 条件运算符“?”:&引用;,c,conditional-operator,C,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为true,则执行A=(~C)-A--。如果为false,则执行++C++(~A) 有人能告诉我并解释一下在printf中A

昨天我用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
为true,则执行
A=(~C)-A--
。如果为false,则执行
++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);
#包括
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);
如果(~A){
printf(“\n out1\n”);
C=A | B
printf(“A=%d B=%d C=%d X=%d\n”,A,B,C,X);
C=c1
printf(“A=%d B=%d C=%d X=%d\n”,A,B,C,X);
顺便问一下,有人能告诉我这些条件是什么意思吗

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程序整体上是无效的:它可以产生它选择的任何输出,不产生输出,甚至崩溃。

为什么不让你的teac感到惊讶呢向她详细解释了正在发生的事情;)


顺便说一句,这是一个可怕的考试问题。但还有什么新鲜事。@David Ameixa这句话有未定义的行为。我打赌UB不是可能的答案之一;)考试的“正确”是什么回答?你能告诉我们进行这种考试的机构的名称,这样我们就可以禁止它教授编程吗?\@DeiDei和其他人告诉UB的方式一样-通过检查代码,并对照C语言标准进行检查。作为一个附带问题,
a=a=5;
也是UB吗?a被分配了两次。(尽管是相同的值)@AjayBrahmakshatriya是的,它是UB,因为C99标准认为写入相同的值是一种修改:“修改”包括存储的新值与以前的值相同的情况(第3部分第3.1节)。如果
B=-2,C=-3
,则
if(B!=C)
当然是正确的,执行过程将继续进行到坏小子
X=(A=(~C)-(A-);
。但是我相信即使代码是
if(B==C)
X=(A=(~C)-(A-))
path未被采用,代码作为一个整体仍然是UB。我确信在某个地方有帖子。@chux:未赋值的代码不是UB,即使它在执行时必然是UB。标准给出了一个结论,即
2 | | 1/0
是一个值为1的有效整数常量表达式,而
1/0
部分不使用UBr2357112嗯-同意
2 | | 1/0
。我得花点时间找到那个帖子。
    ...
    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
    ...