澄清运营商的优先顺序

问题描述 投票:-3回答:2

我从一些练习中得到了这个片段和问题:以下代码的输出:

main()
{
    char *p = "ayqm";
    printf("%c", ++*(p++));
}

我的预期答案是z,但实际答案实际上是b。怎么可能?

稍后编辑:片段是从练习中获取的,并没有关注除printf()代码区域以外的字符串文字或语法问题。

c operator-precedence
2个回答
2
投票

如发布,该程序有多个问题:

  • 它试图修改字符串常量"ayqm",它在C标准中描述为未定义的行为。
  • 它使用printf没有适当的声明,再次产生未定义的行为。
  • 其输出不会以换行符终止,从而导致实现定义的行为。
  • 没有返回类型的main原型已经过时,C标准不再支持。
  • 递增字符会产生实现定义的行为。如果执行字符集是ASCII,'a'+1确实产生'b',但C标准不保证。实际上,在较旧的大型计算机中仍然使用的EBCDIC字符集中,字母是单个单调序列(即:'a'+1 == 'b',但在此字符集中为'i'+1 != 'j')。

这是一个更正版本:

#include <stdio.h>

int main(void) {
    char str[] = "ayqm";
    char *p = str;
    printf("%c\n", ++*(p++));
    return 0;
}

p后递增,这意味着p的当前值用于*运算符,p的值在下一个序列点之前递增,即调用printf函数。然后通过p'a'读取的字符递增,这可能会也可能不会产生'b',具体取决于执行字符集。

printf回到main函数后,p指向str[1]str包含字符串"byqm"


2
投票

您的程序具有未定义的行为,因为它正在尝试修改字符串文字“ayqm”。根据标准尝试修改字符串文字导致未定义的行为,因为它可能存储在只读存储中。

指针p指向字符串文字“ayqm”。这个表达

printf ("%c", ++*(p++));

最终试图修改指针p指向的字符串文字。

程序中的未定义行为包括它可能执行不正确(崩溃或静默生成不正确的结果),或者它可能偶然地完成程序员的意图。

© www.soinside.com 2019 - 2024. All rights reserved.