it-swarm.dev

int * i; veya int * i; veya int * i;

İşaretçi bildirmek için en sevdiğiniz yöntem hangisidir?

int* i;

veya

int *i;

veya

int * i;

veya

int*i;

Lütfen nedenini açıklayınız.

ayrıca bkz: http://www.stroustrup.com/bs_faq2.html#whitespace

30
lesmana

Eğer yazarsanız:

int* i, j, k;

yanıltıcı bir şekilde, i, j ve k'nin hepsinin int işaretçisi olduğunu öneriyorsunuz.

Bu yüzden * değişken ismine ilhak etmenin üstün olduğunu iddia ediyorum.

76
Randall Schulz

Tercih ederim int* i çünkü i "int için bir işaretçi" tipine sahiptir ve bunun yazı sistemiyle aynı olmasını sağladığını hissediyorum. Tabii ki, iyi bilinen davranış, bir satırda birden fazla işaretçi tanımlamaya çalışırken gelir (yani, bir işaretçiyi bildirmek için her değişken adının önüne yıldız işareti konulmalıdır), ancak işaretçileri bu şekilde beyan etmiyorum. Ayrıca, C tarzı dillerde ciddi bir kusur olduğunu düşünüyorum.

62
Tamás Szelei

Tiplere güçlü bir şekilde odaklanmadığımız C için tercih ederim:

int *i;

İşaretçiyi değil, int üzerinde bir amfezi olduğundan. int nedir? *i int.

23
alternative

Yıllarca int* i Tercih ettim. Bununla birlikte, int *i İçin güçlü bir argüman var, çünkü eski stili kullanırken, yine de çoklu bildirim kuralını hatırlamanız gerekiyor:

int* a, *b; // not int* a, b;

Bu kuralı hatırlamanız gerektiğinden, basit bir şekilde kazanamazsınız - ama bunun daha karmaşık olduğunu da söylemezdim. Bir satırda birden çok bildirim kullanmaktan kaçınmak, bu kuralı hatırladığınızı söylemenin başka bir yoludur. İki stil arasındaki fark tartışmalıdır.

Bununla birlikte, onu kullandığım halde, C bildirimi sözdizimi çalışmalarını, yıldız işaretini sözdizimsel olarak bağlı olduğu değişkenden ziyade türün yanına yerleştirerek yaptığı gibi davranmak biraz saçma geliyor.

Ben diğerine int türü (*i İçin) varken bu bir vurgular işaretçi türü (i) için satın almıyorum, ama bu olabilir 15 yıllık C ve C++ kullanımından sonra, sadece baktığımda, bunu düşünmek zorunda kalmadan⁠⁠ — bu soru henüz yapamaz.

Ayrıca, tercihim göz önüne alındığında, diğer stilde kod okumak/yazmak garip bulmuyorum. Tutarlılık, bla bla blah.

int * i İfadesinden bahsetmeye bile gerek yok.

7
Roger Pate

İlkini tercih ederim. İşaretçi türün bir parçası olduğu için doğal gelir.

C # kullandığım için, türleri C'den daha sezgisel bir şekilde işler, bu nedenle aynı ifadede birkaç işaretçi bildirirken sorun yoktur:

int* a, b, c; // three pointers
6
Guffa

Tercih ederim int* i (C++ tarzı).
Ortaya çıkan görsel belirsizlik nedeniyle bir ifadede birden fazla değişken bildirmekten kaçınıyorum (int* i, j).

Gerekçeler için Bjarne Stroustrup'un C++ Stili ve Tekniği SSS konusuna da bakın.

5
Archimedix

Birden çok değişken bildirmek istiyorsanız, ancak yıldız işaretini tekrarlamak istemiyorsanız:

template <typename T>
struct pointer_to
{
    typedef T* type;
};

pointer_to<int>::type p1, p2, p3;

(Yapısal şablonun içinde görebileceğiniz gibi, int* i tarzı.)

Ve işte daha genel bir çözüm:

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

Bu, herhangi bir "sorunlu tür" ile çalışır, örneğin diziler ve referanslar:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
4
fredoverflow

İlk bölüm değişken türünü (int için pointer), ikinci bölüm adı (i) gösterir çünkü int* i; İçin gitmek istiyorum. Türün int ve adın *i Olması bana mantıklı gelmiyor. Ayrıca, int * i; Bana biraz çarpmaya benziyor.

2
Allon Guralnek

int * i; Kullandığım beyanlarda bunu i is a pointer to an integer Olarak okudunuz.

İşaretçi hem türe hem de değişkene katkıda bulunur, böylece ortada olmalıdır.

Aynı satırda birden fazla şey bildirmekten kaçınmak iyi bir şeydir: int * i, j;

2
Tamara Wijsman

Aslında her üç sözleşmeyi de belirli durumlarda kullanıyorum. İlk bakışta tutarsızım, ama ...

  • int * tanımlayıcı yoksa, adın mevcut olmadığını görsel olarak güçlendirmek için.
  • int* intptr _ typedefs ve türün bir parçası olduğunu görsel olarak güçlendirmek için benzer bildirimler. İşlev işaretçisi bildirimlerine benzer şekilde: (int* (*foo)(int))
  • int *identifier ve class &identifier parametrenin potansiyel olarak "çıkış" parametresi olduğunu görsel olarak güçlendirmek için işlev parametrelerinde.
  • const int * const * const her kullandığımda c-v niteleyiciler.
  • int * foo; yerel bildirimlerde.

Sanırım biraz görsel odaklıyım.

1
greyfade

C'de işaretçi türü yok! Yani, "int *" hiçbir şey ifade etmez. Yıldız işareti her zaman sağında yazılı öğeye bağlıdır, sağdaki öğeye aittir. "* i" bir int. Ve * i bir int olduğundan, i'nin int için bir işaretçi olduğu sonucuna varır. Arkasındaki mantık budur ve bu yüzden "int * i" olası tek çözümdür. Diğer her şey bir yanılsamadır (çoğu durumda derleyici tarafından otomatik olarak düzeltilir). C++ ve C # 'da bu farklı bir şeydir. Ancak C için sadece bir incil vardır: "Dennis M. Ritchie: C Programlama Dili". Dennis (R.I.P.!) Yazdı: "int * i". Bunu sorgulamaya gerek yok.

1
Lexi Pim