这是完整的代码
#include<stdio.h>
int main(void) {
printf("%d", "x");
getchar();
return 0;
}
输出为15620184.逻辑上应该返回字符串“x”的数值。但是x本身不是一个字符串。
答案 0 :(得分:9)
我想说清楚,因为其他人已经说过这个代码是错误的,因为它有未定义的行为,所以在你的平台上可以做任何事情。不要这样做......但是为了帮助理解: -
"x"
是一个字符串常量,它衰减到指向字符串的指针,并作为参数传递给printf
。你已经要求它打印一个“int”,所以它将地址的字节解释为int
并打印出来。
实际上,这将以十进制数的形式打印存储字符串的地址。
但标准中没有任何内容可以保证这一点,它可以做任何事情,并且可能在其他平台上有所不同。一般来说,由于C的实现方式,但在大多数情况下它会完成我所描述的。
注意,在某些64位平台上,int是32位,但地址是64位,所以最多可能只打印一个基于地址字节的一半的整数。
正如其他人所说的那样,它是未定义的和坏的所以不要这样做,但它仍然有助于理解它实际上在做什么。
编辑:正如建议的......如果要解释正确传递的数据,请使用%p
代替%d
,告诉printf
将传递的数据解释为内存地址而不是int
。虽然格式是系统相关的,但它可能打印相同的int
,并且是正确定义的行为,然后
答案 1 :(得分:7)
此代码为“ UNDEFINED BEHAVIOR ”,您永远不应该使用它来打印必须使用"%s"
作为说明符的字符串,以打印存储在指针中的地址你必须使用"%p"
并将指针转换为void *
,例如
printf("%p\n", (void *) "x");
总是将{strong>尾随 "\n"
字符添加到printf()
到 flush 输出缓冲区,这对于stderr
来说是唯一不必要的,但是养成这种习惯仍然很好。
另外,"x"
IS 是一个字符串,如果你希望ascii值为'x'
,那么这个
printf("%d\n", 'x');
请注意单引号。
请阅读print(3),了解printf()
和家人处理的许多说明符。
答案 2 :(得分:4)
这段代码有什么作用? printf(“%d”,“x”);
代码将具有未定义的行为。您粘贴的代码会发出警告。通过使用gcc
编译代码,查看我所获得的警告。
warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
printf("%d", "x");
您可以在查看上述警告后了解,代替"x"
您应该传递int
类型的变量或常量,但是您已经传递了一个指向以null结尾的字符数组的指针( which is "x"
)。这是因为你在printf函数中指定了一个格式说明符"%d"
,它需要int
数据类型变量或常量。
逻辑上应该返回字符串&#34; x&#34;
的数字值
要打印char或字符常量('x'
)类型的变量的数值,请使用printf作为
printf("%d", 'x'): //Remeber character literal in c are stored as int
要打印字符数组"x"
,请使用printf as
printf("%s", "x"); //OR
printf("x");
要打印存储在指针中的地址,您必须使用&#34;%p&#34;格式说明符为
printf("%p", "x");
c中有许多格式说明符。下面给出的很少 -
%c - For Character Variable
%d - For Integers
%f - For Double
%s - For Null-Terminated Character Array
%p - For Pointers (of void * type)
答案 3 :(得分:1)
基本上,您尝试将字符串文字"x"
的地址打印为十进制整数,但不能保证其有效。
表达式 "x"
的类型为“{-1}}的2元素数组”;由于表达式不是char
或一元sizeof
运算符的操作数,因此将其转换(“衰减”)为“指向&
的指针”类型的表达式,并且表达式是字符串第一个字符的地址。
char
转换说明符期望其对应的参数具有类型d
;您正在传递类型为int
的参数,因此行为未定义。输出可能是地址值的精确表示形式,作为十进制整数,或者可能是完全垃圾。
类型很重要,特定的转换指定符期望它们的对应参数属于特定类型(改编自Harbison & Steele,§15.11.7):
int *
请注意,指针值的表示是实现定义的。您可能正在处理的大多数平台将以十六进制表示法输出整数值。有些可能会为NULL指针输出字符串“null”。有些人可能使用完全不同的表示。
请注意,要打印指针值,您应该将参数显式地转换为Output Format Specifier Argument Type
------------- --------- -------------
Decimal Integer hhi,hhd char
(Signed) hi,hd short
i,d int
li,ld long
lli,lld long long
zi,zd size_t
ti,td prtdiff_t
ji,jd intmax_t
Decimal Integer hhu char
(Unsigned) hu short
u int
lu long
llu long long
zu size_t
tu prtdiff_t
ju intmax_t
Octal Integer hho unsigned char
ho unsigned short
o unsigned int
lo unsigned long
llo unsigned long long
zo size_t
to ptrdiff_t
jo intmax_t
Hexadecimal hhx,hhX unsigned char
Integer hx,hX unsigned short
x,X unsigned int
lx,lX unsigned long
llx,llX unsigned long long
zx,zX size_t
tx,tX ptrdiff_t
jx,jX intmax_t
Decimal Float f,lf double
Lf long double
Decimal Float, e,E,le,lE double
Exponential Le,LE long double
Notation
Decimal Float, g,G,lg,lG double
Same as f or Lg,LG long double
e depending on
value
Hexadecimal a,A,la,lA double
Float La,LA long double
Single Character c int
Single Wide Character lc wint_t
String s char *
Wide String ls wchar_t *
Pointer Value p void *
(如果它还没有):
void *
这可能是C中唯一需要将指针值显式转换为printf( "%p\n", (void *) "x" );
的地方。