[英]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.