无法理解C程序的输出

时间:2013-11-22 13:54:52

标签: c output

我的代码是:

#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 9 56。 我无法理解这一点。 请有人帮助我,请解释我的输出。 感谢。

3 个答案:

答案 0 :(得分: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++;

答案 1 :(得分: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 !

答案 2 :(得分: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的Ascii现在是56或57,因为printf的评估顺序是未定义的。所以如果这个语句将是56在c++之前评估,或者在c++之后评估57。但是,无论如何,c<='9'都是真的)是。所以声明是真的。在C中,TRUE是1.

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

结果是“9 9 56”