以下程序打印什么?

时间:2011-03-17 08:26:53

标签: c

main()
{
char s[] = "abcdef", *p;
for (p = &s[5]; p >= s; p--) --p*;
puts(s);
return 0;
}

编译器说--p *(期望表达式)有问题?????

4 个答案:

答案 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行错过;

  • 你可能想要

    --p
    

    而不是

    --p*
    

程序然后打印abcdef

这是ideone demo

答案 3 :(得分:1)

缺少分号......我可以清楚地看到它!

相关问题