2014-02-08 12 views
5

I wurde durch die Lösungen eines Problems auf Topcoder suchen, und stieß auf diesem:Bedeutung von „? <=“ Operator

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

Derzeit Ich bin nicht daran interessiert, den Algorithmus funktioniert zu wissen, wie , aber was ist die Verwendung von "<? =" Operator im Code? Ich habe versucht, den Code auf meinem Computer und auch auf ideone.com zu kompilieren, aber zu meiner Überraschung kann der Code nicht kompiliert werden. Was macht der Operator und warum funktioniert er nicht auf Standard-Compilern wie Ideone, und der Code besteht Systemtests auf Topcoder?

Der Code ist hier:

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; 
    } 
}; 
+0

WTH sollte der [Tag: C++] '

+0

@ πάνταῥεῖ Ich bin mir nicht sicher, ob es ein Operator ist, aber es schien eher ein Operator für einen Anfänger wie mich zu sein, ähnlich dem Operator "+ =". – shivshnkr

+0

Da die Antwort von jrok für mich klingt, wäre es besser, wenn Sie das nicht benutzen würden! –

Antwort

6

dass eine gcc-Erweiterung ist, Verbindung Minimum-Operator, einen binären Operator, der das Minimum seiner Operanden auf den linken Operanden zuweisen. Es ist in der deprecated features list des GCC-Handbuch erwähnt.

A <?= B bedeutet das Minimum von A und B zuweisen A.

Es gibt (wurden) auch

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

Sane Code würde heute std::min stattdessen verwenden.

+0

aber warum kompiliert dieser Code auf meinem Computer oder ideone.com nicht, obwohl es Systemtests besteht? – shivshnkr

+0

@shivshnkr, Es ist eine *** veraltete *** GCC * -Erweiterung *. – chris

+0

@chris bedeutet es keine, aber topcoder unterstützt noch veraltete Dinge? – shivshnkr