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