这段代码的输出是什么意思? printf(“%d”,“x”);

时间:2016-05-12 13:40:59

标签: c printf

这是完整的代码

#include<stdio.h>

int main(void) {

    printf("%d", "x");

    getchar();
    return 0;
}

输出为15620184.逻辑上应该返回字符串“x”的数值。但是x本身不是一个字符串。

4 个答案:

答案 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" ); 的地方。