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#?
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#?
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;
yah, myślałem tak samo jak twoja druga wersja, jeśli były one w zasadzie boolami. – RAL
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.
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
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.
-1, pierwsza linia nie będzie się kompilować, a 'const' nie będzie działać tak, jak opisujesz w ostatnim akapicie. – avakar
jakie są typy ihi i inhi? – RAL
Przepraszam, że tak cs = C# i ihi i inhi są typami intergerów – Victor
@Byers IMHO http://en.wikipedia.org/wiki/C_Sharp_(programming_language) –