我的代码是:无法理解ç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 我无法理解这一点。 请有人帮助我,请解释我的输出。 谢谢。
我的代码是:无法理解ç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 我无法理解这一点。 请有人帮助我,请解释我的输出。 谢谢。
基本上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 !
您正在观察未定义的行为。 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++;
它是未定义的吗? [序列点列表](http://stackoverflow.com/questions/3575350/sequence-points-in-c)似乎表明参数在函数调用之前被评估*。 – Gaminic
@Gaminic参数评估的顺序未定义 – Deepthought
是的,但在这种情况下,“奇数页”是常规的“d”。鉴于在实际调用之前评估所有参数,'d'的值是完全可预测/定义的,不是吗? – Gaminic
好吧,你必须知道的第一件事就是,一个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”
“printf从右到左评估”:评估参数的顺序未定义http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function-calling-in -c – Deepthought
@Deepthought没有注意到。我会改变我的答案。谢谢。 – zyc
请解释一下:“C++:这意味着添加c和1并将结果存储在一个临时变量中,此语句将结果从temp值复制到c,因此在当前语句中,c值保持不变, C++的d仍然是56。“ –
这是奇怪! –
char'8'为十进制的'56'。另一部分以及由上述的问题进行处理。 – devnull
您是否在参加代码混淆竞赛或试图了解操作指令? – vextorspace