post和pre递减c函数putchar中的char指针值之间的差异

时间:2015-09-25 09:30:27

标签: c pointers decrement putchar

我在C中有以下代码(我使用tdm-gcc 4.9.1和Netbeans 8.0.2):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * pr(char * str);

int main(void)
{
    char * x;

    x = pr("Ho Ho Ho!");

    return 0;
}

//*************************************

char * pr(char * str)
{
    char * pc;

    pc = str;

    while (* pc)
    {
        putchar(* pc++);
        printf(" %d %d\n", pc, str);
    }

    printf("\n");
    printf(" %d %d\n", pc, str);  
    printf("\n");

    do 
    {
        putchar(* pc--); // alternate case: * --pc
        printf(" %d %d\n", pc, str);
    } while (pc - str);

    return (pc);
}

在do-while循环中,当putchar函数内的参数为

* pc--

我打印了以下结果 (第一列打印字符串&#34; Ho Ho Ho!&#34;,一次一个字符,  第二列打印指针到char的地址,而  第3列打印指向char str的地址:

H 4206629 4206628
o 4206630 4206628
  4206631 4206628
H 4206632 4206628
o 4206633 4206628
  4206634 4206628
H 4206635 4206628
o 4206636 4206628
! 4206637 4206628

 4206637 4206628

 4206636 4206628
! 4206635 4206628
o 4206634 4206628
H 4206633 4206628
  4206632 4206628
o 4206631 4206628
H 4206630 4206628
  4206629 4206628
o 4206628 4206628

Ho Ho Ho!!oH oH o

当putchar函数内的参数为

* --pc

相应的结果是

H 4206629 4206628
o 4206630 4206628
  4206631 4206628
H 4206632 4206628
o 4206633 4206628
  4206634 4206628
H 4206635 4206628
o 4206636 4206628
! 4206637 4206628

 4206637 4206628

! 4206636 4206628
o 4206635 4206628
H 4206634 4206628
  4206633 4206628
o 4206632 4206628
H 4206631 4206628
  4206630 4206628
o 4206629 4206628
H 4206628 4206628

Ho Ho Ho!!oH oH oH

我的问题如下:关于do-while循环中putchar函数输出的后缀和前缀递减运算符之间的区别是什么?

非常感谢任何反馈。

1 个答案:

答案 0 :(得分:3)

您的问题的答案在名称中:前缀在之前执行某些操作 postfix 执行某些操作

简而言之:

  • 前缀递增/递减在之前执行/递减,为您提供该递增/递减的结果。
  • Postfix递增/递减为您提供旧值,然后执行递增/递减。

无论您对哪种类型的变量执行操作,这都是一样的。

让我们说你有字符串

char str[] = "Hello";
char *p = str;

然后做

*++p

将递增指针p(使其指向字符串中的'e'字符),然后取消引用该指针,为您提供字符'e'

如果你那么做

*p--

然后指针首先取消引用,你得到'e'字符(再次)和然后指针递减并再次指向第一个字符。

在评论中使用新示例,语句putchar(*++string);等同于

string = string + 1;
putchar(*string);

声明putchar(*string++);等同于

char *compiler_generated_temporary_variable = string;
string = string + 1;
putchar(*compiler_generated_temporary_variable);

请注意增量的完成顺序。