2015-03-13 16 views
8

Cevabın hayır olduğundan şüpheleniyorum, ancak C++ tekli ön ve postfix azaltma operatörü "++" ile bir eşdeğer var. Örneğin.Delphi'de Unary ++ işleci

int test = 1; 
SomeFunc(test++); // test is 1 inside SomeFunc and 2 afterwards 
test = 1; 
Somefunc(++test); // test is 2 inside SomeFunc and 2 afterwards 

Ben Delphi Inc (ve Aralık) operatörü hakkında biliyorum, ama olduğu gibi bir işleve geçemeyecek: derleme hata ek olarak

test: Integer; 
//... 
SomeFunc(Inc(test)); // compiler error, incompatible types 

, yok mu farklı bir ön ve postfix artışı gibi görünüyor. Onun değil büyük bir sorun yazma böyle kod:

SomeFunc(test); 
test := (test + 1); 
SomeFunc(test); 

ancak ++ (ve -) C operatörleri ++ büyük bir özelliği vardır.

cevap

9

Delphi'de yerleşik olarak eşdeğer bir işlev yoktur.

Böyle yazı fonksiyonları düşünmek olabilir:

function PostInc(var Value: Integer): Integer; 
begin 
    Result := Value; 
    inc(Value); 
end; 

function PreInc(var Value: Integer): Integer; 
begin 
    inc(Value); 
    Result := Value; 
end; 

Muhtemelen satır içi tür işlevleri yapmak isteyen olacaktır. Her ne kadar bu gibi işlevlerin ne kadar yararlı olacağı tartışmaya açıktır.


Şahsen ben bu operatörler C ve C++ bazen kullanışlıdır, ancak onlar için durum ezici olmadığını düşünüyoruz. Kesinlikle yeni başlayanlar için, ++i++ + i++ gibi ifadeler hakkında sorulan soruların düzenli akışı tarafından görülebileceği gibi, içine düşmek için büyük bir tuzak sunarlar.

FWIW, operatörlerin açıklamanız kesin değildir. Dediniz:

int test = 1; 
SomeFunc(test++); // test is 1 inside SomeFunc and 2 afterwards 

Bu doğru değil. test değişkeni SomeFunc den önce artırılır, çünkü bir işlev çağrısı bir sıralama noktasıdır. Yani,, SomeFunc içinden gözlenirse 2 değerine sahiptir. Ancak SomeFunc'a verilen değer 1'dur. Bu program:

#include <iostream> 

int test = 1; 

void foo(int x) 
{ 
    std::cout << x << std::endl; 
    std::cout << test << std::endl; 
} 

int main() 
{ 
    foo(test++); 
} 

çıkışları

 
1 
2 
+0

Tamam, teşekkürler. Beklenildiği gibi. Bu kadar çabuk nasıl cevapladın, BTW? : o) – AlainD

+5

@AlainD 78 saniye pratikte bir sonsuzluk ... David'in bir NeuroSky MindWave ile doğrudan SO'ya bağlı olduğunu;) –

+0

@David: Tamam, doğru "test" globaldir, ancak yerel değişken. Bu yorum için teşekkürler. – AlainD

0

sadece istedi Eğer Succ kullanabilirsiniz fonksiyonu, yani SomeFunc(Succ(Test)); için arttırılmış değerini geçmesi, ancak Testi sonradan artırılır.

+0

Neden 'SomeFunc (Test + 1)' yazıp yazmak yerine bunu yaparsınız? Her neyse, tüm nokta C ve C++ işleçlerinin değişkenin değerini değiştirmesidir.Bence asker zaten ikili aritmetik işlemcileri nasıl kullanacağını biliyor. –

+0

İhtiyaçlardan daha karmaşık şeylerin nasıl yapılabileceği konusunda büyüleyici değil :-) Ancak, Succ' da tüm numaralandırmalarla birlikte çalıştığı için daha genel bir çözümdür. Şahsen ben de bu durumda + 1 yazarım. – Hans