main()
{
char s[] = "abcdef", *p;
for (p = &s[5]; p >= s; p--) --p*;
puts(s);
return 0;
}
编译器说--p *(期望表达式)有问题?????
答案 0 :(得分:4)
--p*
没有任何意义。
可能你的意思是--*p
或--p
?
当底层表示为ASCII时,您的代码将打印`abcde
。 BTW C99要求托管环境中main()
的返回类型为int
。
答案 1 :(得分:3)
是的, 是--p*
的问题,它不是有效的C,因此程序什么都不打印。您还在char s[] ...
行末尾错过了分号。
也许你的意思是这样的:
#include <stdio.h>
int main (void) {
char s[] = "abcdef", *p;
for (p = &s[5]; p >= s; p--) --*p;
puts(s);
return 0;
}
打印:
`abcde
(假设您当然在ASCII环境中运行)。
并且任何书都将main
声明为:
main()
而不是两种规范形式中的一种,应该被抛弃。
另外需要注意的一点是,标准并没有强制指针aritmetic能够工作,除非两个指针指向对象内部或超出末尾。因此,将p
(&(s[-1])
)的最终值与s
进行比较并不能保证能够正常工作。更好的解决方案是:
#include <stdio.h>
int main (void) {
char s[] = "abcdef", *p;
for (p = s; *p != 0; p++) --*p;
puts(s);
return 0;
}
C99的相关部分是6.5.6/8
:
当一个具有整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型。
...
如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。如果结果指向数组对象的最后一个元素之后,则不应将其用作被计算的一元*运算符的操作数。
答案 2 :(得分:3)
答案 3 :(得分:1)
缺少分号......我可以清楚地看到它!