2016-08-30 1 views
0

Jemand könnte mir, wenn dieser Code sagen:Rückkehr wahrscheinlich (x) in c, wie es Arbeit ist?

int a = 1; 
int b = 0; 
if (likely(a >= b)) 
    return 1; 

das gleiche mit diesen anderen machen?

return (likely(a>= b)) 

Vielen Dank für die Hilfe.

+1

Was ist "wahrscheinlich" –

+0

für eine Definition von 'wahrscheinlich', siehe http://StackOverflow.com/Questions/109710/likely-unlikely-Macros-in-the-linux-kernel-how-do-they- Arbeit-was-was-ihre – DaBler

+0

Sehr wahrscheinlich das Gleiche. Aber Sie müssen den zurückgegebenen Wert als boolesch behandeln. –

Antwort

3

likely ist nicht Teil der C-Sprache. Es muss irgendwie durch den Kontext des Codes definiert werden, in dem Sie das gesehen haben. (Es ist wahrscheinlich ein Makro, das zu einem Compiler-spezifischen Konstrukt erweitert, dass der Compiler sagt a >= b ist wahrscheinlich um wahr zu sein, die Optimierung helfen kann. Aber aus dem Code, den Sie zeigten, wissen wir das nicht sicher.

)

Unter der Annahme, dass likely ist in der Tat so ein Makro, wir können es auf Ihre eigentliche Frage entfernen und fortfahren:

if (a >= b) 
    return 1; 

ist nicht die gleiche wie

return a >= b; 

weil sie verschiedene Dinge tun, wenn a kleiner als b ist. return a >= b; gibt 0 zurück, wenn a kleiner als b ist, aber if (a >= b) return 1; geht weiter zu dem, was unterhalb der if-Anweisung liegt, wenn a kleiner als b ist.

Zwei Konstrukte, die sind äquivalent zu return a >= b; sind

if (a >= b) 
    return 1; 
else 
    return 0; 

und

if (a >= b) 
    return 1; 
return 0; 

Die meisten erfahrenen C-Programmierer eher return a >= b; als entweder sehen würde.

[Zusatz: return likely(a >= b); ist eine merkwürdige Sache zu schreiben, weil die Funktion in beide Richtungen zurückkehrt, und der Code, der den Rückgabewert einrichtet, ist kurz, einfach und (oft) zweigfrei. Es könnte denkbar sein, einen Hinweis auf interprocedural optimization bereitzustellen, aber es wäre natürlicher, diese Art von Hinweis als eine Anmerkung zu dem Funktionsprototyp auszudrücken, z.

extern int fstat(int fd, struct stat *st) 
    __attribute__((expected_return_value(0))); 

(Anmerkung:. Keine echte GCC Funktion Anmerkung soweit ich weiß)]

2

Sie sind nicht die gleichen, weil der erste Code-Block nicht sofort zurück, wenn a >= b falsch ist , es geht weiter mit dem Rest der Funktion (die Sie nicht gezeigt haben). Also, wenn die nächste Zeile nicht return 0; ist, sind sie anders.

Mit den Werten von a und b, die Sie angeben, entspricht der gesamte Codeblock einfach return 1;. Aber ich nehme an, dass es für a und b unterschiedliche Werte haben kann.

+0

In dem ganzen Code gibt es eine else mit return 0, also wenn dieser Fall der gleiche sind? int a = 1; int b = 0; if (wahrscheinlich (a> = b)) zurück 1; sonst zurück 0 –

+0

Dann ist es das gleiche. Wenn du das meinst, hättest du es in der Frage schreiben sollen. – Barmar

+0

@annacoobs, 'if (wahrscheinlich (a> = b)) gebe 1 zurück; else return 0; 'ist in der Tat äquivalent, aber wie du sagst:" Im ganzen Code gibt es einen else ... "kann nicht gleichwertig gemacht werden, da es * * * * * im * all-code * einige * * * * * * * * * * * * * *} anders. Sie sind nur äquivalent, wenn der * gesamte Code * auf eine "Rückgabe 0" reduziert wird. nach der 'if' Anweisung. –

Verwandte Themen