C 条件运算符“?”:&引用;
昨天我用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
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
...