什么是 C++ 中的“<?=”运算符? [复制]

Posted

技术标签:

【中文标题】什么是 C++ 中的“<?=”运算符? [复制]【英文标题】:What's "<?=" operator in C++? [duplicate] 【发布时间】: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)

【问题讨论】:

多么愚蠢的一段代码。当您需要在紧跟其后的评论中解释非标准的三字符运算符时,就是您停止使用它的时刻。 【参考方案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

【讨论】:

“条件运算符”。

以上是关于什么是 C++ 中的“<?=”运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c++中的各种符号是啥意思?

OpenCV C++中的矩阵复共轭

在 C++ 中使用 std::complex<T> 创建复无穷大

C++中的多重插入运算符<<

C++ 中的 delete vs delete[] 运算符

C++ 中的指针成员 ->* 和 .* 运算符是啥?