[英]what does the following program print?
main()
{
char s[] = "abcdef", *p;
for (p = &s[5]; p >= s; p--) --p*;
puts(s);
return 0;
}
编译器说--p *(期望表达式)有问题?
--p*
没有任何意义。
可能您是说--*p
或--p
吗? 当基础表示形式为ASCII时,代码将输出`abcde
。 BTW C99要求main()
的返回类型在托管环境中为int
。
是的,有一个问题--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()
而不是两种规范形式之一,应该扔掉。
需要注意的另一件事是,标准没有强制要求指针算术运算符将起作用,除非两个指针都指向对象内或一个指针指向末尾。 因此,不能保证将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
:
将具有整数类型的表达式添加到指针或从指针中减去时,结果将具有指针操作数的类型。
...
如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素,则求值不会产生溢出; 否则,行为是不确定的。 如果结果指向数组对象的最后一个元素之后,则不应将其用作被评估的一元*运算符的操作数。
缺少分号...我可以清楚地看到它!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.