Bitişik dize değişmezlerini bitiştirirken


17

C ve C ++ bitişik dize değişmezlerini tek dize değişmezleri olarak derler. Örneğin bu:

"Some text..." "and more text"

şuna eşittir:

"Some text...and more text"

C # veya Java gibi diğer C-aile dillerinde, bu bir sözdizimi hatasıdır (BTW mükemmel bir şekilde iyidir).

C ve C ++ 'ın bunu yapmasının mantığı / tarihsel nedeni nedir?

Yanıtlar:


24

Orijinal C dili, 1969-1972'de hesaplamaya 80 sütunlu delikli kartın hâkim olduğu bir zamanda tasarlandı. Tasarımcıları ASR-33 Teletype gibi 80 sütun cihazı kullandı. Bu cihazlar metni otomatik olarak sarmaz, bu nedenle kaynak kodunu 80 sütun içinde tutmak için gerçek bir teşvik vardı. Fortran ve Cobol, sonunda serbest biçime geçmeden önce bunu yapmak için açık devam mekanizmalarına sahipti.

Dennis Ritchie'nin (sanırım) gramerde herhangi bir belirsizlik olmadığını ve uzun ASCII dizelerinin, derleyicinin bitişik değişmez dizeleri birleştirmesini sağlamanın kolay yolu ile 80 sütuna sığabileceğini fark etmesi parlak bir vuruştu. Sayısız C programcısı bu küçük özellik için minnettardı.

Özellik girdikten sonra, neden kaldırılsın? Keder yaratmaz ve sıklıkla kullanışlıdır. Bir dileğimde daha fazla dil olsaydı. Modern eğilim, üçlü tırnak veya diğer sembollerle genişletilmiş dizelere sahip olmaktır, ancak C'deki bu özelliğin sadeliği hiç geçmemiştir.


8
Başka bir neden, dize değişmezleri olarak tanımlanan önişlemci makrolarının birleştirilmesine izin vermesidir, örneğin, #define FOO "foo-value"daha sonra"FOO's value is " FOO "."
Blrfl

3
@Blrfl: Aynen öyle. Dize birleştirme işleminin makro değiştirme tamamlandıktan sonra gerçekleştiğini anlamak önemlidir.
david.pfx

7

C'nin +C # ve Java gibi belirli bir dize birleştirme operatörü ( ) yoktur . C # veya Java'da, derleyici gördüğünde

"a" + "b"

kodu aynen sanki derleyebilir

"ab"

kaynak kodunda yazılmıştır. Bununla birlikte, C'de, derleyicinin tanıyabileceği ve önceden hesaplayabileceği dizelerin birleştirilmesini tanımlamak için benzer kolay bir sözdizimi yoktur. Yani C tasarımcıları onlarca yıl önce bunu seçti

"a" "b"

tam olarak aynı anlama gelir

"ab"

Doğal olarak C ++ aynı sözleşmeyi miras aldı. Standart C ++ kütüphanesi aşırı yükler iken +üzerinde std::stringortalama dize birbirine bağlanmasına yol, derleyici birleşmeye denemez "a" + "b"bu bir hata aslında, çünkü (iki ekleyemezsiniz const char *işaretçileri birlikte).


1
C'nin ayrıca belirli bir dize türü yoktur, bunun yerine bellekteki karakterlere işaretçiler seçer. İşaretçiler ekleyemezsiniz ve bir +şekilde birleştirme anlamına gelse de, birleştirilmiş dizenin nereye gittiğini sorunu çözmeniz gerekir.
Blrfl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.