Значение на оператора ‹?=

Преглеждах решенията на проблем в Topcoder и попаднах на това:

http://community.topcoder.com/stat?c=problem_solution&rm=249419&rd=9996&pm=6621&cr=309453

В момента не ме интересува как работи алгоритъмът, но какво е използването на оператора "‹ ?=" в кода? Опитах се да компилирам кода на моята машина, а също и на ideone.com, но за моя изненада, кодът не успява да се компилира. Какво прави операторът и защо не работи на стандартни компилатори като ideone, а кодът преминава системни тестове на Topcoder?

Кодът е тук:

using namespace std;

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#include <string>
#include <sstream>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <functional>

#define PB push_back
#define SZ size()
#define REP(v, hi) for (int v=0; v<(hi); v++)
#define REPD(v, hi) for (int v=((hi)-1); v>=0; v--)
#define FOR(v, lo, hi) for (int v=(lo); v<(hi); v++)
#define FORD(v, lo, hi) for (int v=((hi)-1); v>=(lo); v--)

typedef vector <int> VI;
typedef vector <VI> VVI;
typedef vector <VVI> VVVI;

/* ############################ THE REAL CODE ############################ */

class RoboRace {
  public:
  int startTime(vector <string> m, vector <string> _c) {
    string c;
    REP(i,_c.SZ) c+=_c[i];
    int N=c.SZ;
    int Y=m.SZ, X=m[0].SZ;
    VVVI best(Y, VVI(X, VI(N+1, 99999)));
    int ey=-1,ex=-1;
    int yy=-1,yx=-1;
    int fy=-1,fx=-1;
    REP(y,Y) REP(x,X) {
      if (m[y][x]=='Y') { yy=y; yx=x; m[y][x]='.'; }
      if (m[y][x]=='F') { fy=y; fx=x; m[y][x]='.'; }
      if (m[y][x]=='X') { ey=y; ex=x; m[y][x]='.'; }
    }
    REP(n,N+1) best[ey][ex][n]=n;
    REPD(n,N) REP(y,Y) REP(x,X) {
      if (m[y][x]=='#') continue;
      best[y][x][n] <?= best[y][x][n+1];
      if (c[n]=='N' && y>0)   best[y][x][n] <?= best[y-1][x][n+1];
      if (c[n]=='S' && y<Y-1) best[y][x][n] <?= best[y+1][x][n+1];
      if (c[n]=='W' && x>0)   best[y][x][n] <?= best[y][x-1][n+1];
      if (c[n]=='E' && x<X-1) best[y][x][n] <?= best[y][x+1][n+1];
    }

    REP(n,N) if (best[yy][yx][n] < best[fy][fx][n]) return n;
    return -1;
  }
};

person shivshnkr    schedule 08.02.2014    source източник
comment
КАКВО трябва да бъде операторът c++<?=?? Никога не съм чувал за този...   -  person πάντα ῥεῖ    schedule 09.02.2014
comment
@πάνταῥεῖ не съм сигурен, че е оператор, но изглеждаше повече като оператор за начинаещ като мен, подобно на оператора +=.   -  person shivshnkr    schedule 09.02.2014
comment
Както ми звучи отговорът на jrok, по-добре е да не използвате това!   -  person πάντα ῥεῖ    schedule 09.02.2014
comment
не разбирам защо получавам гласове за това, че не знам нещо!!   -  person shivshnkr    schedule 09.02.2014
comment
Целият код е куп wtf :)   -  person jrok    schedule 09.02.2014


Отговори (1)


Това е разширение на gcc, съставен минимален оператор, двоичен оператор, който присвоява минимума от своите операнди на левия операнд. Споменава се в списъка с остарели функции на gcc ръководство.

A <?= B означава присвояване на минимума от A и B на A.

Има (били) също

<?     minimum operator
>?     maximum operator
>?=    compound form of maximum operator

Разумният код в наши дни би използвал std::min вместо това.

person jrok    schedule 08.02.2014
comment
но защо този код не се компилира на моята машина или ideone.com, въпреки че преминава системни тестове? - person shivshnkr; 09.02.2014
comment
@shivshnkr, това е отхвърлено GCC разширение. - person chris; 09.02.2014
comment
@chris означава, че няма, но topcoder все още поддържа отхвърлени неща? - person shivshnkr; 09.02.2014
comment
@shivshnkr, предполагам, че да. - person chris; 09.02.2014