#include <stdio.h>
int main()
{
char *arr = "This is to test";
printf("\n%c %c ",*(arr++), *(arr++));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序输出h T而不是输出h h.为什么会这样?
在一个语句中使用两个相互独立的递增运算符会导致未定义的行为,因为编译器可以自由选择首先执行哪个增量(或者更确切地说,您没有给编译器提供任何首先要做的提示).
无论如何,如果你期望的话h h,写*(arr++)两次也是错的,因为它们将被执行两次,递增arr 两次 - 因此将打印两个不同的字符(arr[0]和arr[1]).
另一个错误是使用后增量,这将导致在获取字符后arr递增,因此它将输出,而不是.Th
所以一个可能的解决方案是这个代码,使用另一个变量:
#include <stdio.h>
int main()
{
char *arr = "This is to test";
char c = *(++arr);
printf("\n%c %c ", c, c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,arr只会增加一次,并且稍后可以使用在此位置获取的字符.
arr ++相当于arr + = 1.你实际上正在递增arr.这就是你的情况.
printf("\n%c %c ",*(arr++), *(arr++));
// ^ ^Evaluates to 0 therefore prints T then increments by 1
// ^Evaluates to 1 therefore prints h and then increments by 1
//Now if where to prinf %s arr it should print "is is to test"
Run Code Online (Sandbox Code Playgroud)
你想做的是
printf("\n%c %c ",*(arr+1), *(arr+1));
Run Code Online (Sandbox Code Playgroud)
注意:正如其他人已经指出多个pre/postfix ++/ - 产生未定义的行为(评估顺序)并且应该避免,尽管我在你的情况下理解你并没有尝试修改原始数组.