【问题标题】:Difference between post and pre decrement a char pointer value in c function putcharc函数putchar中post和pre递减char指针值的区别
【发布时间】:2015-12-23 02:26:33
【问题描述】:

我在 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函数的输出,后缀和前缀减量运算符有什么区别?

任何反馈都将不胜感激。

【问题讨论】:

  • 与您的问题无关,但如果您想打印带有printf 的指针,您应该使用"%p" 格式。
  • 打印地址如:printf(" %p %p\n", (void*) pc, (void*) str); 否则你会得到 UB

标签: c pointers decrement putchar


【解决方案1】:

您的问题的答案在 names 中:prefixbefore 做一些事情,而 postfix 在做一些事情之后

简而言之:

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

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


假设你有字符串

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

然后做

*++p

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

如果你这样做

*p--

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


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

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

而声明putchar(*string++);等价于

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

注意增量的顺序。

【讨论】:

  • 感谢您的反馈。我是 C 新手,所以我使用 %d 说明符来打印指针,以便更轻松地跟踪递减过程。我了解前缀和后缀是如何工作的,但我不明白它们如何影响我在问题中提到的 putchar 函数的结果。在前缀的情况下,“!”字符对应于地址 4206636,而在后缀对应物中,指针按预期递减到地址 4206636,但“!”字符打印在地址 4206635 旁边。
  • 此线程 - stackoverflow.com/questions/5209602/… - 提供了一些见解,但问题令人困惑,特别是考虑到在上述设置中所涉及的运算符的优先级未解决。
  • @UrovorosOfis 正如我在回答中已经解释的那样,*++string 将在取消引用之前修改指针 first。而*string++ 将修改指针之后。更新了答案并解释了您的最新示例。
  • 如果我使用putchar(*string++) 的函数打印字符串“I am I”,我会得到“I am I”。但是使用putchar(*++string) 我会得到“我是”。为什么只省略第一个字符?
  • @UrovorosOfis Again,前缀增量修改指针before解引用,因此它跳过了第一个字符。您是否甚至费心阅读我的答案,尤其是上次更新?
猜你喜欢
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2020-12-23
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多