Printf ailesi için yüzde belirteci (%) neden format belirteci olarak seçildi?


27

Herkes bilir ki, en azından C de, printfformatlanmış bir dize yazdırmak için fonksiyonlar ailesini kullanıyorsunuz . Ve bu işlevler , bir format belirticinin başlangıcını belirtmek için bir yüzde işareti ( %) kullanır. Örneğin, %dbir yazdırmak intve %ubir yazdırmak anlamına gelir unsigned int. printfİşlevlerin ve biçimlendirmenin yer tutucuların nasıl çalıştığını bilmiyorsanız veya yalnızca bir tazeleme gerekiyorsa , Wikipedia makalesi başlamak için iyi bir yerdir.

Sorum şu, bunun orijinal olmasının veya gelecekte format belirticisi olarak gelecekte seçilmesi gerektiğinin özellikle zorlayıcı bir nedeni var mı?

Açıkçası, karar çok uzun zaman önce verildi (C dilini bile selefine göre çok büyük olasılıkla) ve o zamandan beri "standart" oldu (yalnızca C dilinde değil, aynı zamanda çok sayıda diğer dilde de). sözdizimini çeşitli derecelerde benimsemişlerdir), bu yüzden değişmek için artık çok geç. Ancak, bu seçimin neden ilk başta yapıldığı konusunda bir fikir sahibi olup olmadığına ve benzer bir işlevselliğe sahip yeni bir dil tasarlıyorsa seçimin hala bir anlam ifade edip etmediği konusunda hala merak ediyorum.

Örneğin, C # (ve diğer .NET dil ailesi) ile Microsoft, dize biçimlendirme işlevlerinin işleyişiyle ilgili biraz farklı bir karar vermiştir. Orada bir dereceye kadar güvenlik emri uygulanabilir (her printfne kadar C'nin uygulanmasından farklı olarak ) ve bu nedenle karşılık gelen parametrenin tipinin bir göstergesini eklemek gereksizdir, ancak sıfır indeksli küme parantez çiftleri kullanmaya karar vermişlerdir ( {}). format belirteci olarak, şöyle:

string output = String.Format("In {0}, the temperature is {1} degrees Celsius.",
                              "Texas", 37);
Console.WriteLine(output);

// Output:
//     In Texas, the temperature is 37 degrees Celsius.

String.FormatYönteme ilişkin belgeler , genel olarak bileşik biçimlendirme hakkında bu makalede olduğu gibi daha fazla bilgi içerir , ancak kesin ayrıntılar oldukça önemsizdir. Mesele şu ki %, bir format belirleyicinin başlangıcını belirtmek için uzun süredir devam eden uygulamalarını bıraktıklarıdır . C dili sadece kolayca kullanmış olabilir {d}ve {u}ancak öyle olmadı. Herkes neden, bu kararın geriye dönük olarak mantıklı gelip gelmediği ve yeni uygulamaların onu takip edip etmemesi gerektiği konusunda herhangi bir fikri var mı?

Açıkçası, dizeye dahil edilebilmesi için kaçmak zorunda kalmayacak bir karakter yok, ancak bu sorun zaten sadece ikisini kullanarak çözüldü . Başka hangi hususlar önemlidir?


5
Kaçan sorun olduğu değil iki karakter kullanılarak çözüldü. Sadece kaçman için bir karakterin daha var.
JJJ

2
Meraklıyım. Kuşkusuz, kullanmak {u}yerine kullanmak mümkün %uolacaktı ama önemli bir avantajı olacak mıydı? Büyük oranda keyfi bir seçim gibi görünüyor.
CB Bailey

12
@ JarrodRoberson yani {}C # öğrenen kişilerin başka hiçbir şey öğrenmeye başlamaması için bilerek sözdizimini seçtiklerini söylüyorsunuz ? Bunun tasarım kararlarının bir parçası olsa bile büyük olduğuna inanmak çok zor. İfadenizi bir şekilde yedekleyebilir misiniz?
stijn

6
İlginç bir şekilde, Python (çok daha üstün bir biçim) %biçimlendirmeyi .NET'in {}biçimlendirmesine benzer bir şey lehine terk etti çünkü ikincisi daha fazla esneklik sunuyor.
Konrad Rudolph

3
Gökyüzü neden mavi, neden "mavi" kelimesi mavi? Bir şey seçmek zorunda kaldılar.

Yanıtlar:


12

@Secure'ın not ettiği gibi, C'nin printffonksiyonu BCPL'nin fonksiyonundan esinlenmiştir writef. BCPL için wikipedia sayfasına bakarsanız, BCPL'nin writefde %bir format belirteci tanıtmak için kullanıldığını gösteren bir örneği vardır .

Böylece, BCPL'nin kullandığından %veya BCPL'nin kullandığı nedenlerden dolayı C'nin kullanıldığına karar verebiliriz . İçimdeki hisler, bunun basitçe %en az kullanılan ASCII karakterlerinden biri olduğunun ... ya da yazarların düşündüğüdür. Ayrıca, çeşitli alternatiflerin tartılmasında çok zaman harcamamış olmaları da olasıdır. O zaman, hem BCPL hem de C, anlaşılmaz dillerdi ve yazarların başa çıkmaları daha önemli şeylerdi.

Ancak, eserlerinde küçük bir somun anahtarı var. C, BCPL'den ilham alırken, C'nin BCPL G / Ç kitaplıklarını veya başka bir yoldan ödünç aldığı tamamen belli değildir. BCPL'nin G / Ç kütüphanelerinin, giriş byte endeksleme operatörünün dile eklenme zamanı ile ilgili bir evrim sürecinden geçtiğini hatırlıyorum. (Aslında, sanırım bunu kimin bildiğini biliyorum.)


3
“Aslında, sanırım bunu kimin bileceğini biliyorum” ... ve? ... ve? .. Bizi sadece uçurum askılı bırakmayın ...
Mawg

2
@Mawg - Brian Knight muhtemelen yapardı. Ian Wilson muhtemelen yapardı. Martin Richards kesinlikle öyle olurdu. HTH.
Stephen C,

6

Vikipedi girişi, kendine özgü değil printf, genel olarak karakterlerden kaçmak için çok fazla tarih bilgisi içermiyor .

http://en.wikipedia.org/wiki/Escape_character

"Kaçış karakteri" teriminin ilk referansı Bob Bemer’in IBM teknik yayınlarında bulunmaktadır. Anlaşılan, ASCII karakter setindeki çalışmaları sırasında bu mekanizmayı icat eden kişi oydu.

Tahminim şudur: Ters eğik çizgi zaten hazır bilgi dizgileri için kullanılıyordu ve biçim dizeleri için başka bir karakter gerekiyordu. Büyük olasılıkla, normal kullanım ve oluşma sıklığının en düşük olduğu varsayılan karakteri seçtiler.

Btw, başka bir ilgili makale orada daha önce duyduğum nether bir terim ile bağlantılı:

http://en.wikipedia.org/wiki/Leaning_toothpick_syndrome

Makalede printfdaha fazla bilgi parçacığı var, ancak nedenleriyle ilgili değil.

http://en.wikipedia.org/wiki/Printf

C'nin variadic printf'in kökeni BCPL'nin writef işlevinde bulunuyor.

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.