什么是 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;
注意最后两行,应用运算符<?=
。正如所评论的那样,以下行
adjmat[v1][v2]<?=tmp; // <?= sets left to min(left,right)
将left
设置为min(left,right)
。
我以前从未见过这个运算符。我在VS中尝试了代码,它无法编译。它是什么?如何将left
设置为min(left,right)
?
【问题讨论】:
多么愚蠢的一段代码。当您需要在紧跟其后的评论中解释非标准的三字符运算符时,就是您停止使用它的时刻。 【参考方案1】:这是一个旧的GCC extension;它按照评论中所说的去做(它是“最小”运算符的复合赋值形式)。这不是标准的 C++。
a = a < b ? a : b
和a <?= b
的区别在于后者只对每个操作数求值一次。
在现代标准 C++ 中,我相信您可以像这样编写“分配最小值”算法:
auto && __a = a;
auto && __b = b;
if (!(__a < __b)) __a = std::forward<decltype(__b)>(__b);
这应该是具有a <?= b
效果的宏的主体,而a
和b
是任意表达式,可能具有副作用。或者您可以将其包装到模板中:
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++ 中的“<?=”运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章