明确说明运算符的优先级

时间:2019-03-24 12:36:33

标签: c operator-precedence

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

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

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

以后的编辑:该摘录直接来自练习,不关注printf()代码区以外的字符串文字或语法问题。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

程序中未定义的行为可能会导致执行不正确(崩溃或无提示地生成不正确的结果),或者可能偶然地执行了程序员想要的操作。

答案 1 :(得分: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"