【问题标题】:-Wsequence-point warning - what does it mean and does it violate ANSI C standard?-Wsequence-point 警告 - 这是什么意思,是否违反了 ANSI C 标准?
【发布时间】:2017-04-02 07:38:50
【问题描述】:

排队

tab[i] = tab[i+1] - tab[i] + (tab[i+1] = tab[i]);

我有一个警告

[Warning] operation on '*(tab + ((sizetype)i + 1u) * 4u)' may be undefined [-Wsequence-point]

我想在没有临时变量且不违反 ANSI C 的情况下交换这两个整数数组元素。程序仍然可以工作,但是可以吗?

【问题讨论】:

    标签: compiler-warnings swap ansi-c


    【解决方案1】:

    您的代码依赖于标准未涵盖的行为。因此,您的代码可能在不同的编译器、同一编译器的不同版本上表现不同,甚至根据周围的代码表现不同。

    问题是您在没有分隔序列点的情况下评估并分配给tab[i+1]。对您来说,您的程序将从左到右执行计算似乎很明显,但 C 标准并不要求这样做。编译器可以将您的代码编译为:

    tab[i+1] = tab[i];
    tab[i] = tab[i+1] - tab[i] + tab[i+1];
    

    作为单独的说明。交换两个变量是一种高度优化且易于识别的操作,任何优化编译器都会选择最快的指令,如果你写的话:

    int temp = tab[i];
    tab[i] = tab[i+1];
    tab[i+1] = temp;
    

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 2012-09-12
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多