【问题标题】:A 7 Line Simple C Code That I Can't Figure Out [duplicate]我无法弄清楚的 7 行简单 C 代码 [重复]
【发布时间】:2021-10-24 06:25:44
【问题描述】:

谁能解释一下为什么这里的输出是 2 1 1,这里 c 的优先级是什么?为什么 i++ 的输出是 1。在此先感谢 ~

#include <stdio.h>

void main(){
int i=1;
int *p=&i;
printf("%d%d%d\n",*p,i++,i);
}

【问题讨论】:

  • 仅供参考,main 总是返回 int。总是。
  • 我的理解是这是未定义的行为。允许编译器在将参数传递给函数之前以任何顺序评估参数。
  • 在测试中,您必须回答“未指定”。如果这不是一个选项,您的讲师可能不应该教 C。
  • @ProgEnthusiast 既然您提到这是在一次测试中出现的,那么将这个问题提请您的讲师注意可能是值得的。作为支持,您可以提出 C99 标准的相关部分,即 §6.5.2.2/10。您可以在此处获取该标准的副本:open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf。请参阅第 72 页的相关段落,其内容为 “未指定函数指示符、实际参数和实际参数中的子表达式的评估顺序,但在实际调用之前有一个序列点”.
  • @ProgEnthusiast:测试有缺陷。这是 C 标准未定义行为的众所周知的情况。

标签: c pointers operators logical-operators


【解决方案1】:

C 标准并未根据 C 2018 6.5 2 定义此代码的行为:

如果标量对象的副作用相对于同一标量对象的不同副作用或使用同一标量对象的值的值计算是未排序的,则行为未定义......

i++ 的副作用是更新 i 的增量值。函数调用参数还包括*pi,两者都引用i并使用它的值。 i 是一个标量对象。函数调用参数的评估顺序及其副作用是无序的(这意味着 C 标准不对它们施加任何排序要求)。因此,上述规则的所有条件都满足,因此C标准没有定义该行为。

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多