【问题标题】:Explanation of ++val++ and ++*p++ in CC语言中++val++和++*p++的解释
【发布时间】:2011-04-09 06:30:53
【问题描述】:
int val = 5;

printf("%d",++val++); //gives compilation error : '++' needs l-value

int *p = &val;
printf("%d",++*p++); //no error

谁能解释这两种情况?谢谢。

【问题讨论】:

  • 在这种情况下,发布您看到的错误消息和您正在使用的编译器(版本)通常会有所帮助。
  • 没有人应该写出这样的代码。
  • 投票结束不是一个真正的问题。这样的代码在现实生活中是找不到的。任何只是像这样的语法意外的东西都应该指向一个常见问题解答,它只是说不要傻。
  • @Martin:如果你在现实生活中发现了这样的代码,请修复它,然后打负责人。

标签: c increment operator-precedence


【解决方案1】:

++val++++(val++) 相同。由于val++ 的结果不是左值,因此这是非法的。正如斯蒂芬佳能指出的那样,如果val++ 的结果是左值,++(val++) 将是未定义的行为,因为++s 之间没有序列点。

++*p++++(*(p++)) 相同。因为*(p++)的结果左值,所以这是合法的。

【讨论】:

  • 很好的答案,尽管我会注意到即使val++ 是左值,行为仍然是未定义的。例如,C++ 中的(++val)++ 会调用未定义的行为。
  • 后增量运算符总是返回一个rvalue(在 C 和 C++ 中)。在 C++ 中,(++val)++ 调用未定义行为,因为预增量 (++) 运算符返回一个左值(在 C++ 中)并且val 的值在两个序列点之间被多次修改。
【解决方案2】:

表达式++val++(++val)++ 相同(或者可能是++(val++),反正不是很相关)。 ++ 运算符的结果不是变量,而是值,不能将运算符应用于值。

表达式++*p++++(*(p++)) 相同。 p++ 的结果是值,而*(p++) 的结果是一个内存位置,++ 运算符可以应用到。

【讨论】:

  • ++val++++(val++) 相同,与(++val)++不同。 (虽然在 C 中,两者在语法上都是无效的)
  • @Stephen Canon:是的,它评估的是哪一个并不明显。由于表达式无效,我从不费心去了解它是两个无效变体中的哪一个。 :)
  • 啊,但是在 C++ 中,其中一个是无效的,而另一个在语法上有效但在语义上未定义。 (C++ 很古怪!)
【解决方案3】:

还请注意,您将指针的地址更改为

int k = ++*p++;

【讨论】:

  • 是的,我知道。为了简单起见,我使用它。代替 int val,我可以使用 int 数组。
【解决方案4】:

int j = ++val++; //gives compilation error

那是因为您不能预先增加 rvalue++val++ 被解释为 ++(val++) 因为后增量运算符的优先级高于前增量运算符。 val++ 返回一个 rvalue 并且预增量运算符要求其操作数是一个 lvalue。 :)

int k = ++*p++; //no error

++*p++ 被解释为++(*(p++)),完全有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2022-06-27
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多