我在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函数输出的后缀和前缀递减运算符之间的区别是什么?
非常感谢任何反馈。
答案 0 :(得分:3)
您的问题的答案在名称中:前缀在之前执行某些操作, 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);
请注意增量的完成顺序。