【问题标题】:What's "<?=" operator in C++? [duplicate]什么是 C++ 中的“<?=”运算符? [复制]
【发布时间】:2014-01-15 20:25:21
【问题描述】:

我遇到了以下代码here,它来自使用邻接矩阵的 Dijkstra 算法的 C++ 实现。

//read in edges keeping only the minimum
for(int i=0; i<E; i++) {
    int v1,v2,tmp;
    fin >> v1; fin >> v2;
    fin >> tmp;
    adjmat[v1][v2]<?=tmp; // <?= sets left to min(left,right)
    adjmat[v2][v1]<?=tmp;
}

注意最后两行,应用运算符&lt;?=。正如所评论的那样,以下行

adjmat[v1][v2]&lt;?=tmp; // &lt;?= sets left to min(left,right)

left 设置为min(left,right)

我以前从未见过这个运算符。我在VS中尝试了代码,它无法编译。它是什么?如何将left设置为min(left,right)

【问题讨论】:

  • 多么愚蠢的一段代码。当您需要在紧跟其后的评论中解释非标准的三字符运算符时,就是您停止使用它的时刻。

标签: c++ operators operator-keyword min


【解决方案1】:

这是一个旧的GCC extension;它按照评论中所说的去做(它是“最小”运算符的复合赋值形式)。这不是标准的 C++。

a = a &lt; b ? a : ba &lt;?= b 的区别在于后者只对每个操作数求值一次。


在现代标准 C++ 中,我相信您可以像这样编写“分配最小值”算法:

auto && __a = a;
auto && __b = b;
if (!(__a < __b)) { __a = std::forward<decltype(__b)>(__b); }

这应该是具有a &lt;?= b 效果的宏的主体,而ab 是任意表达式,可能具有副作用。或者您可以将其包装到模板中:

template <typename T,
          typename U,
          typename P = std::less<std::common_type_t<std::decay_t<T>, std::decay_t<U>>>
T && clamp_to_minimum(T && a, U && b, P p = P())
{
    if (!(p(a, b))) { a = std::forward<U>(b); }
    return std::forward<T>(a);
}

【讨论】:

  • 我可以在 Visual Studio (C++) 中使用它吗?这是否意味着后者会更有效率?
  • @herohuyongtao:“这是一个 GCC 扩展”似乎非常明确......
  • @Jongware:嗯,它也可能是其他编译器的扩展,但我不知道。你总能想出一段等效的标准代码...
  • 在哪里可以找到有关此运算符的更多信息?
  • @herohuyongtao:我添加了一个链接。我相信这已从最近的 GCC 中删除。
【解决方案2】:

相当于:

adjmat[v1][v2] = (adjmat[v1][v2]<tmp)? adjmat[v1][v2] : tmp;

一般:

a OP ?= b; a = (a OP b)? a : b;

一个小例子(在 Windows 上使用 MingW2.95 和 C-Free IDE 编译)显示了 @Kerrek SB 所说的:GCC 扩展只计算一次操作数,这很好

#include <stdio.h>

int f(int x)
{
    printf ("Calling f() with x=%d\n", x);
    return x*x;
}

int main()
{
    int a,b,c;

    printf ("A and B? ");
    scanf ("%d%d", &a, &b);

    c = a;
    a = (a<f(b))? a : f(b);
    printf ("A using ternary operator: %d\n", a);

    a = c;
    a <?= f(b);
    printf ("A using weird GCC extension: %d\n", a);

    return 0;
}


A and B? 3 1
Calling f() with x=1
Calling f() with x=1
A using ternary operator: 1
Calling f() with x=1
A using weird GCC extension: 1

【讨论】:

  • “条件运算符”。
猜你喜欢
  • 2021-03-28
  • 2021-11-26
  • 1970-01-01
  • 2011-09-28
  • 2017-11-21
  • 2015-11-16
  • 2015-01-22
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多