2010-02-26 14 views
13

mam ten kawałek kodu w C++:Mylące użycie przecinka w „czy” oświadczenie

ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1); 

Ale jak to będzie wyglądać w C#?

+0

jakie są typy ihi i inhi? – RAL

+0

Przepraszam, że tak cs = C# i ihi i inhi są typami intergerów – Victor

+0

@Byers IMHO http://en.wikipedia.org/wiki/C_Sharp_(programming_language) –

Odpowiedz

14

Oznacza to:

if (y[0]>y[1]) 
{ 
    inhi = 1; 
    ihi = 0; 
} else { 
    inhi = 0; 
    ihi = 1; 
} 

lub pisemne inny sposób (w C++):

inhi = (y[0]>y[1]); 
ini = !inhi; 
+0

yah, myślałem tak samo jak twoja druga wersja, jeśli były one w zasadzie boolami. – RAL

9

Operator przecinek wiąże niższa od przyporządkowania, to wyrażenie

inhi=1,0 

zestawy inhi do 1, a następnie powraca 0. Podobnie

inhi=0,1 

zestawy inhi do 0 i zwraca 1. To wszystko jest równoważne z

if(y[0] > y[1]) { 
    inhi = 1; 
    ihi = 0; 
} else { 
    inhi = 0; 
    ihi = 1; 
} 

Proponuję przepisanie go w ten sposób, jeśli możesz. inhi i ihi wydają się mieć ten sam cel (w tym zestawieniu), a operator trójskładnikowy mieszany (?:) i operator przecinka, mają różne wagi.

+0

to jest jasne, dzięki za wyjaśnienie Jesse, powodem, dla którego byłem po tłumaczeniu (od C++ do C#) było to, że jak powiedziałeś (? :) i użycie przecinka nie skompilowało się w C#. – Victor

1

comma operator ocenia argumenty po kolei, a następnie zwraca ostatni oceniany wyraz. To znaczy. jeśli miał następujący kod

int four = 2 + 2, mul(2,2), 4; 

ściśle-po-the-specyfikacja zakaz optymalizacji kompilator najpierw dodać 2 i 2, a następnie wyrzucić rezultat, a następnie wywołać funkcję mul i wyrzucić zwracanej wartości i ostatecznie ocenić 4, który następnie jest przypisany do zmiennej i.

Należy zauważyć, że po każdym przecinku występuje sequence point, więc wszystkie efekty uboczne z poprzednich ocen zostaną wykonane. Na przykład. w

ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1); 

przypisanie do inhi jest zrobione i wykończone przedihi jest aktualizowana. Oznacza to również, że kompilator nie może zoptymalizować wywołania do mul w powyższym przykładzie, chyba że wie 100% na pewno, że funkcja mul nie ma żadnych skutków ubocznych innych niż zwracanie wartości. Zwykle nie jest to coś, o czym wie kompilator, chociaż w C++ można oznaczyć funkcje jako const, za pomocą których mówi się o tym kompilatorowi.

+0

-1, pierwsza linia nie będzie się kompilować, a 'const' nie będzie działać tak, jak opisujesz w ostatnim akapicie. – avakar