1

我在 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--

我打印了以下结果(第一列打印字符串“Ho Ho Ho!”,一次一个字符,第二列打印指向字符 pc 的地址,而第三列打印指向 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函数的输出,后缀和前缀减量运算符有什么区别?

任何反馈将不胜感激。

4

1 回答 1

4

您的问题的答案在于名称前缀在之前做一些事情,而后缀在之后做一些事情。

简而言之:

  • 前缀增量/减量给您增量/减量的结果之前执行增量/减量。
  • 后缀增量/减量为您提供旧值,然后进行增量/减量。

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


假设你有字符串

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);

注意增量完成的顺序。

于 2015-09-25T09:35:33.137 回答