我的代码是:
#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。 我无法理解这一点。 请有人帮助我,请解释我的输出。 感谢。
答案 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”