我昨天用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--。如果为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);顺便问一下,谁能告诉我这些if条件是什么意思?
发布于 2017-06-30 01:42:48
这句话
X = B != C ? A=(~C) - A-- : ++C + (~A);等同于
if(B != C)
X = (A = (~C) - (A--));
else
X = ++C + (~A);因此,表达式A = (~C) - (A--)调用未定义的行为。在这种情况下,不能期待任何好的东西。
也就是说,这是一个错误的问题,不应该在考试中问。或者,只要一个选项声明代码将调用未定义的行为,就可以用多个选项答案来询问它。
发布于 2017-06-30 01:43:28
此问题永远不应出现在考试中,因为它包含未定义的行为。
具体地说,此赋值A = (~C) - A--修改A两次-在--复合赋值中,以及在赋值本身中。由于两者之间没有sequence point,因此行为是未定义的。
注意:这并不意味着程序不会打印任何东西。它肯定会在大多数平台上产生一些输出。然而,这些都无关紧要,因为C程序是完全无效的:它可以产生任何它选择的输出,不产生任何输出,甚至崩溃。
发布于 2017-06-30 02:46:26
为什么不用非常详细的解释给你的老师一个惊喜呢?)
...
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
...https://stackoverflow.com/questions/44831643
复制相似问题