【问题标题】:Output involving increment operator [duplicate]涉及增量运算符的输出[重复]
【发布时间】:2015-05-29 05:53:45
【问题描述】:

解释输出 .程序已经在gnu上编译(gcc 4.9.2编译器)

#include <stdio.h>

main()
{
    int i=1;
    int arr[]={2,3,4,5};
    int x=(i++<3);

    printf("%d  %d  %d  %d  %d",i,x,++i[arr],i++[arr],i);
}

输出:3 1 6 4 3

【问题讨论】:

  • 这是未定义的行为。输出可以是任何东西。
  • @Amit ,实际上,它确实可以编译。但是有警告......
  • @CoolGuy i[arr] 会编译吗?不知道...它会翻译成什么?
  • @AyushNigam 没有对输出的解释。您的参数会引发对i 的未排序评估和修改。事实上,clang 甚至会警告你:“未排序的修改和访问 'i'”。如果 gcc 不考虑调高您的警告级别和选项。

标签: c output


【解决方案1】:

这里有一个“副作用”。根据底层架构,printf() 的参数从左到右或从右到左(例如 HPUX)进行评估。

所以你不能说,什么是“THE”结果。您只能使用编译链在您的操作系统上指定结果。

这种行为称为Undefined behavior and sequence points

【讨论】:

  • 首先,in c arr[i] 等价于 i[arr] 现在说到重点,上面的问题确实有解决方案,并且不依赖于机器,因为它已经在很多人中被问过Adobe等知名公司的面试,所以我很高兴知道正确的答案
  • NOPE: function(f1(),f2()); 取决于调用策略(我们谈论“C”而不是“C++”!),如果 f1 和 f2 有副作用,则不同架构上的结果会有所不同。
  • 正确答案是:“在 C 下,这是机器依赖行为”。
猜你喜欢
  • 2023-03-26
  • 2012-11-23
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2019-09-25
  • 2019-12-05
  • 2016-02-02
  • 1970-01-01
相关资源
最近更新 更多