【问题标题】:Unable to understand the output of C progaram [duplicate]无法理解 C 程序的输出 [重复]
【发布时间】:2013-12-07 10:24:54
【问题描述】:

我的代码是:

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

【问题讨论】:

  • char 8 是十进制的56。另一部分,上面提到的问题处理得很好。
  • 您是在参加代码混淆比赛还是试图了解操作顺序?
  • 查看pvv.org/~oma/DeepC_slides_oct2011.pdf 的第 159、189、196、197 页幻灯片 :-)

标签: c output


【解决方案1】:

您正在观察未定义的行为。 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++;

【讨论】:

  • 是否未定义? list of sequence points 似乎建议在函数调用之前评估参数。
  • @Gaminic 未定义评估参数的顺序
  • 是的,但在这种情况下,“奇数打印”是常规的“d”。鉴于所有参数在实际调用之前进行评估,'d' 的值是完全可预测/定义的,不是吗?
【解决方案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 !

【讨论】:

  • @Srikanth,感谢您的回答
  • -1 ,printf从右到左读取参数不正确,stackoverflow.com/a/9566538/2327831
  • 好的,我更正我的说法。输出可能因编译器而异。但在这个特定场景中,它是从右到左读取的,因此我们可以看到这种行为。前几天在另一个编译器中可能会完全不同。
【解决方案3】:

好的,首先你要知道的是,一个字符在内存中存储为Ascii Table。所以在内存中char c 将有一个整数值'8'。从表中我们知道'8'的整数值是56。根据表我们会得到:

'8':56

'0':48

'9':57

让我们开始吧。

c++:是将c加一并返回当前c值的语句。

例子:

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

这段代码的结果是“a=1,c=2”

所以 c++ 的 %d 仍然是 56。

d+=c&gt;'0'&amp;&amp;c&lt;='9': 根据 C 的优先级,这个语句会是这样的:

d+=(c&gt;'0'&amp;&amp;c&lt;='9')

让我们先从c&gt;'0'&amp;&amp;c&lt;='9' 开始。这是一个条件语句。 c 的 Ascii 值是否大于或等于 0 的 Ascii 值且小于或等于 9 的 Ascii 值?(注意 c 的 Ascii 现在是 56 或 57,因为 printf 的评估顺序未定义。所以如果评估此语句,它将是 56在c++ 之前,如果在c++ 之后,则为57。但无论哪种方式,c&lt;='9' 都是真的)是的。所以这个说法是真的。在 C 中,TRUE 是 1。

所以d+=c&gt;'0'&amp;&amp;c&lt;='9' 将是d+=1,这意味着 d=d+1。所以%d 的 d 是 9。

所以结果是“9 9 56”

【讨论】:

  • "printf 是从右到左计算的": 参数计算的顺序没有定义stackoverflow.com/questions/376278/…
  • @Deepthought 没有注意到这一点。我会改变我的答案。谢谢。
  • 请解释一下:“c++:表示将c和1相加并将结果存储在一个临时变量中。在此语句之后将结果从临时值复制到c。所以在当前语句中, c 值保持不变。所以 c++ 的 %d 仍然是 56。"
  • @zyc ,我明白了。谢谢你的解释
  • @GaurangTandon 抱歉,我的第一个解释不准确。 temp 变量将存储 c 的当前值,并且 c 加一。但是临时值将是++ 语句的返回值。这是屏幕背后的真实情况。我已经改变了我的答案。对不起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多