c - post和pre递减c函数putchar中的char指针值的区别

标签 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--

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

如有任何反馈,我们将不胜感激。

最佳答案

您的问题的答案在名称中:prefix之前做某事,而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);

注意增量完成的顺序。

关于c - post和pre递减c函数putchar中的char指针值的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32779056/

相关文章:

c++ - C++ 中的指针比较是未定义或未指定的行为吗?

c++ - 指针操作的未知使用

java - 递增图像的 x 位置然后递减它在 java 中不起作用

Python pandas 根据时间间隔减少回填,直到达到一定数量

c - 可以为 scanf ("%x"传递 int 的地址吗,...)?

无法获得 scanf_s 或切换工作

c - 为什么这段代码给我一个段错误?

将一行从文件复制到数组 (C)

标准C中指针指向整数错误的比较

java - 在Java中,为什么我不能写i++++或(i++)++?