Std :: numeric_limits <unsigned char> üyelerine çağrı yapmadan önce tekli bir “+” nın amacı nedir?


130

Bu örneği cppreference belgelerinde gördümstd::numeric_limits

#include <limits>
#include <iostream>

int main() 
{
    std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";

    std::cout << "uchar\t"
              << +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::max() << '\n';
    std::cout << "int\t"
              << std::numeric_limits<int>::lowest() << '\t'
              << std::numeric_limits<int>::min() << '\t'
              << std::numeric_limits<int>::max() << '\n';
    std::cout << "float\t"
              << std::numeric_limits<float>::lowest() << '\t'
              << std::numeric_limits<float>::min() << '\t'
              << std::numeric_limits<float>::max() << '\n';
    std::cout << "double\t"
              << std::numeric_limits<double>::lowest() << '\t'
              << std::numeric_limits<double>::min() << '\t'
              << std::numeric_limits<double>::max() << '\n';
}

"+" Operatörünü anlamıyorum

<< +std::numeric_limits<unsigned char>::lowest()

Onu test ettim, "-" ile değiştirdim ve bu da işe yaradı. Böyle bir "+" operatörünün kullanımı nedir?


3
Dene. Dışarıda bırakırsanız ne elde edersiniz +?
Pete Becker

4
Bu soru olmaz gerek ... kod umurunda yazar ne anlama geldiğini açıklamak veya bunun yerine açık döküm kullanmak eğer asker olmak
user202729

ile değiştirirseniz -, çıkışlar sınırlar için doğru değerler olmayacaktır
phuclv

1
Kayıt için, Google'a bu tür bir şeyi kendi içinde istiyorsanız, buna "tekli artı" operatörü denir - tek bir değer alır (bu durumda, hemen arkasındaki şey) ve "artı "demenin Google dostu yoludur +. Bu durumda, sorgunuz muhtemelen "c ++ unary plus" olacaktır. Bu ... tam olarak sezgisel değil ve yine de bulacağınız belgeleri okumayı öğrenmek zorundasınız, ancak IMO, geliştirmek için yararlı bir beceridir.
Fund Monica'nın Davası

Yanıtlar:


137

<<Bir char(işaretli veya işaretsiz) geçirildiğinde çıktı operatörü bunu bir karakter olarak yazacaktır .

Bu işlev, türdeki değerleri döndürür unsigned char. Ve yukarıda belirtildiği gibi, bu değerlerin tamsayı değerlerini değil, mevcut kodlamada temsil ettiği karakterleri yazdıracaktır.

+Operatör dönüştürür unsigned charbir için bu işlevler tarafından döndürülen intaracılığıyla tamsayı promosyon . Bu, bunun yerine tamsayı değerlerinin yazdırılacağı anlamına gelir.

Gibi bir ifade +std::numeric_limits<unsigned char>::lowest()esasen eşittir static_cast<int>(std::numeric_limits<unsigned char>::lowest()).


37

+Orada açmak için bir unsigned charbir içine int. +Operatör değeri koruyarak, ama onun işlenen üzerinde ayrılmaz promosyon uyaran etkisine sahiptir. operator <<Bir karakter türü verildiğinde yazdırılacak bazı (yarı) rastgele karakterler yerine sayısal bir değer gördüğünüzden emin olmak içindir .


18

Sadece daha önce verilen cevaplara bir referans eklemek için. CPP standart çalışma taslağından N4713 :

8.5.2.1 Tekli operatörler
...

  1. Tekli + operatörünün işlenen aritmetik, kapsamı açık olmayan numaralandırma veya işaretçi türüne sahip olacaktır ve sonuç, argümanın değeridir. İntegral yükseltme, integral veya numaralandırma işlenenleri üzerinde gerçekleştirilir. Sonucun türü, yükseltilen işlenenin türüdür.

Ve char, short, intve longayrılmaz türleridir.


12

+Sonuç olmadan farklı olacak. Aşağıdaki kod parçacığı a 97yerinea a

char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';

Bunun nedeni, farklı aşırı yüklerin farklı veri türlerini yazdırmasıdır . basic_ostream& operator<<( char value );Aşırı yükleme yok std::basic_ostreamve sayfanın sonunda açıklanıyor

Karakter ve karakter dizesi argümanlar (örn Çeşidi charya const char*) tarafından işlenir üye olmayan aşırı bir operator<<. Üye işlev çağrısı sözdizimini (örneğin std::cout.operator<<('c');) kullanarak bir karakter çıktılamaya çalışmak , aşırı yüklerden birini (2-4) çağırır ve sayısal değeri verir . Üye işlev çağrısı sözdizimini kullanarak bir karakter dizisi çıkarmaya çalışmak, aşırı yüklemeyi (7) çağırır ve bunun yerine işaretçi değerini yazdırır.

Üye olmayan aşırı bir pas çağrılacak chardeğişkendir

template< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<(
    basic_ostream<CharT,Traits>& os, char ch );

kod noktasında karakteri yazdıran ch

Yani temelde geçtiğiniz takdirde char, signed charya unsigned chardoğrudan akışa karakteri yazdırıldığı. +Yukarıdaki satırlardan kaldırmayı denerseniz , beklenildiği gibi olmayan bazı "garip" veya görünmeyen karakterler yazdığını göreceksiniz.

Onların sayısal değerleri istiyorsanız bunun yerine sizin için aşırı çağırmalıdır short, int, longveya long long. Bunu yapmanın en kolay yolu , tekli artı ile terfi charetmektir . Bu , tekli artı operatörünün nadir kullanışlı uygulamalarından biridir . Açık bir oyuncu kadrosu da işe yarayacakint+int

SO'da bu sorunla karşılaşan birçok insan var.


1
Eksi değil tekli artı mı demek istediniz ?
Ruslan
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.