这两个程序如何在c中工作

时间:2016-08-04 12:58:15

标签: c string pointers printf increment

1.第一个程序

void main()
{
int x=30;
printf("%d",printf("%d",x))
}

2.第二个计划

 void main()
 {
 char *x="abcdef";
 x++;
 printf("%s",x);
 } 

我需要知道这段代码是如何工作的 第一个代码的输出是302 第二个代码是bcdf 字符指针如何排序字符串的地址

3 个答案:

答案 0 :(得分:2)

首先必须纠正第一个代码

#include <stdio.h>

int main(void)
{
   int x=30;
   printf("%d\n",printf("%d",x));
}

此代码打印302由于:

  • 对printf的嵌套调用打印x的值 30
  • 外部printf打印嵌套printf的返回值,即 2 。正如the man所说

      

    返回值

         

    成功返回后,这些函数返回打印的字符数(不包括用于结束输出到字符串的空字节)。

必须更正的第二个代码:

#include <stdio.h>

int main(void)
{
   char *x="abcdef";
   x++;
   printf("%s\n",x);
}

过于简单无法解释,你应该看看一本好的C书并研究一些有关指针的内容。

修改

OP评论答案后:

"%s"格式说明符打印指针指向的字符串。如果要打印指针地址,则必须使用"%p"格式说明符。所以:

printf("%p\n", (void *)x);

查看this example

查看the man

  

<强>取值

     

如果不存在l修饰符:const char *参数应该是指向字符类型数组(指向字符串的指针)的指针。数组中的字符被写入(但不包括)终止空字节(&#39; \ 0&#39;);如果指定了精度,则不会写入指定的数量。如果给出精度,则不需要存在空字节;如果未指定精度,或者大于数组的大小,则数组必须包含终止空字节。

     

如果存在l修饰符:const wchar_t *参数应该是指向宽字符数组的指针。数组中的宽字符将转换为多字节字符(每个字符都通过调用wcrtomb(3)函数,转换状态从第一个宽字符之前的初始状态开始),直到并包括终止空宽字符。生成的多字节字符被写入(但不包括)终止空字节。如果指定了精度,则不会写入比指定数字更多的字节,但不会写入部分多字节字符。请注意,精度决定了写入的字节数,而不是宽字符数或屏幕位置数。该数组必须包含一个终止的空宽字符,除非给出一个精度,并且它太小,以至于在到达数组结束之前写入的字节数超过它。

     

<强> P

     

void * pointer参数以十六进制打印(就像通过%#x或%#lx一样)。

答案 1 :(得分:1)

这是一个非常基本的行为。对于第一个程序,将评估嵌套的printf。因此,计算机将在屏幕上打印30。如果您查看printf()的手册页,您会看到printf()函数返回屏幕上打印的字符数。此返回值用作外部printf()调用的参数,该调用也会打印在屏幕上,这就是您看到302的原因。

第二个例子只是一些指针算法。 char *x= "abcdef";定义一个指向字符串的指针(以NULL结尾的字符数组)。所以x指向数组的第一个元素(你的字符数组)。该数组的每个元素都是大小为1字节的char。因此,如果您增加x,您的计算机将向其地址添加数组元素的大小(此处为1个字节),您将指向第二个元素。这就是您打印bcdf

的原因

答案 2 :(得分:0)

printf返回写入的字符数。因此,它打印“30”(因为你打印x)然后打印“2”(因为它写了2个字符)。如果在每个printf中添加“\ n”,您会发现不同。

x是指针时,执行x++会增加指向的地址。当你在一个数组中时,你将转移到数组的下一个单元格。由于字符串是char的数组,x+1将指向字符串的第二个字符(此处为“b”)。打印字符串时,打印每个字符直到结束,从x指向的字符开始。这就是你打印“bcdef”的原因:它从x+1开始打印每个角色。