繁体   English   中英

以下程序打印什么?

[英]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

将具有整数类型的表达式添加到指针或从指针中减去时,结果将具有指针操作数的类型。

...

如果指针操作数和结果都指向同一数组对象的元素,或者指向数组对象的最后一个元素,则求值不会产生溢出; 否则,行为是不确定的。 如果结果指向数组对象的最后一个元素之后,则不应将其用作被评估的一元*运算符的操作数。

  • 你错过了; 在第3行,并且,

  • 你可能想要

     --p 

    代替

     --p* 

然后,程序将输出abcdef

这是一个ideone演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM