2013-11-22 38 views
-1

我的代码是:无法理解çprogaram的输出

#include<stdio.h> 
int main() 
{ 
    char c='8'; 
    int d=8; 
    printf("%d %d %d",d,d+=c>='0'&&c<='9',c++); 
    return(0); 
} 

这个问题的输出是:9 56 我无法理解这一点。 请有人帮助我,请解释我的输出。 谢谢。

+0

这是奇怪! –

+0

char'8'为十进制的'56'。另一部分以及由上述的问题进行处理。 – devnull

+3

您是否在参加代码混淆竞赛或试图了解操作指令? – vextorspace

回答

2

基本上printf的读取从右到左这样的说法,第一印刷将是

" printf("%d %d %d",d,d+=c>='0'&&c<='9',c++); " 

- 1st output = c++ -> which is nothing but ascii value of '8' = 56 
    and then c is incremented by 1 . 

- next is the d -> it boils down to d = d + if(c>='0'&&c<='9') ... 
    so d = d+1 so 9 here 

- next d again so it is again Hope it is clear ! 
+0

@ Srikanth,谢谢你的回答 –

+0

-1,* printf从右到左读取参数*不正确,http://stackoverflow.com/a/9566538/2327831 – this

+0

好的,我更正了我的陈述。输出可能因编译器而异。但在这种特定情况下,它是从右向左阅读,因此我们可以看到这种行为。在另一个编译器中,它可能完全不同。 – Srikanth

5

您正在观察未定义的行为。 d作为参数传递两次,并且一次带有副作用。如果按顺序依次进行的副作用将它们传递给函数时,你的代码应该是相当于

char c='8'; 
int d=8; 
printf("%d",d); 

d+= (c>='0)' && (c<='9'); 
printf(" %d", d); 
printf(" %d",c); 
c++; 

但由于它是在什么样的顺序未定义的参数计算,你在这里看到的:

char c='8'; 
int d=8; 

d+= (c>='0)' && (c<='9'); 
printf("%d",d); 
printf(" %d", d); 
printf(" %d",c); 
c++; 
+0

它是未定义的吗? [序列点列表](http://stackoverflow.com/questions/3575350/sequence-points-in-c)似乎表明参数在函数调用之前被评估*。 – Gaminic

+2

@Gaminic参数评估的顺序未定义 – Deepthought

+0

是的,但在这种情况下,“奇数页”是常规的“d”。鉴于在实际调用之前评估所有参数,'d'的值是完全可预测/定义的,不是吗? – Gaminic

2

好吧,你必须知道的第一件事就是,一个char存储在存储器Ascii Table。所以在内存中char c将有一个整数值'8'。从上表中我们知道, '8' 的整数值是56,根据表中我们会得到:

'8':56

'0':48

'9' :57

因此,让我们开始吧。

c++:这是一个语句,它将c加1并返回当前c的值。

实施例:

int a,c; 
c=1; 
a=c++; 
printf("a=%d,c=%d",a,c); 

此代码的结果是 “A = 1,C = 2”

所以C的%d ++仍然56.

d+=c>'0'&&c<='9':根据至C的优先此声明将如下所示:

d+=(c>'0'&&c<='9')

所以我们先从c>'0'&&c<='9'开始。这是一个条件声明。是C的ASCII值极大或等于0的ASCII值小于或等于9的ASCII值?(注意C'S ASCII是56或57,因为现在的printf评估顺序是不确定的,所以这将是56,如果这种说法是c++之前评估或者如果c++ 57后,但两者的方法,c<='9'为true)YES。所以这个陈述是真实的。在C TRUE为1

d+=c>'0'&&c<='9'所以将d+=1这意味着d = d + 1。因此,d的%d是9

所以结果是 “9 9 56”

+1

“printf从右到左评估”:评估参数的顺序未定义http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function-calling-in -c – Deepthought

+0

@Deepthought没有注意到。我会改变我的答案。谢谢。 – zyc

+0

请解释一下:“C++:这意味着添加c和1并将结果存储在一个临时变量中,此语句将结果从temp值复制到c,因此在当前语句中,c值保持不变, C++的d仍然是56。“ –