C中的字符串操作,语法正确,但它不适用于MacOS或freeBSD

-5 c linux macos bsd gcc

适用于Linux 32/64 Windows 32/64使用GCC,DOS和OS2编译,在Mac OS上使用MS编译器或使用GCC编译BSD,转到无限循环

char *b,p[]={'0','1','2','3','4','5','6','7','8','9','\0'};
for (b=p;(*(b++)=*b););
printf("p=%s\n",p);

// result:
// 123456789

// Test for MacOS or BSD
unsigned char Test=0x0F;
for (b=p;((*(b++)=*b) && --Test););
if (!Test) printf("Error\n");


// OK for Mac OS or FreeBSD
for (b=p;(*b);b++) *b=*(b+1);
printf("p=%s\n",p);

// result:
// 123456789
Run Code Online (Sandbox Code Playgroud)

好的,现在它可以工作了,但问题仍然存在,为什么如果语法正确它不起作用?

das*_*ght 6

问题是这个表达式没有排序:

*(b++)=*b
Run Code Online (Sandbox Code Playgroud)

实质上,被修改的值不止一次被访问,而中间没有序列点.这意味着行为未定义.

您的另一个表达式没有未定义的行为,因为修改发生在循环头中:

*b=*(b+1)
Run Code Online (Sandbox Code Playgroud)