Saya melihat contoh ini dalam dokumentasi cppreference untukstd::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';
}
Saya tidak mengerti operator "+" di
<< +std::numeric_limits<unsigned char>::lowest()
Saya telah mengujinya, menggantinya dengan "-", dan itu juga berhasil. Apa gunanya operator "+" seperti itu?
c++
char
unary-operator
Zhang
sumber
sumber
+
?-
maka output tidak akan menjadi nilai yang benar untuk batas+
. Dalam hal ini, kueri Anda mungkin adalah "c ++ unary plus". Ini ... tidak sepenuhnya intuitif, dan Anda masih harus belajar membaca dokumentasi yang akan Anda temukan, tetapi IMO itu adalah keterampilan yang berguna untuk dikembangkan.Jawaban:
Operator keluaran
<<
ketika dilewatkanchar
(ditandatangani atau tidak ditandatangani) akan menuliskannya sebagai karakter .Fungsi tersebut akan mengembalikan nilai tipe
unsigned char
. Dan seperti dicatat di atas yang akan mencetak karakter yang mewakili nilai-nilai itu dalam pengkodean saat ini, bukan nilai integernya.The
+
bertobat operatorunsigned char
dikembalikan oleh fungsi-fungsi keint
melalui promosi bilangan bulat . Yang berarti nilai integer akan dicetak sebagai gantinya.Ekspresi suka
+std::numeric_limits<unsigned char>::lowest()
pada dasarnya sama denganstatic_cast<int>(std::numeric_limits<unsigned char>::lowest())
.sumber
+
apakah ada untuk mengubahunsigned char
menjadiint
. The+
operator adalah nilai melestarikan, tetapi memiliki efek merangsang promosi terpisahkan dari operan nya. Ini untuk memastikan Anda melihat nilai numerik alih-alih beberapa (semi) karakter acak yangoperator <<
akan dicetak saat diberi jenis karakter.sumber
Hanya dengan menambahkan referensi ke jawaban yang sudah diberikan. Dari draft kerja standar CPP N4713 :
Dan
char
,short
,int
, danlong
adalah jenis yang tidak terpisahkan.sumber
Tanpa
+
hasilnya akan berbeda. Cuplikan berikut menghasilkana 97
bukannyaa a
Alasannya adalah karena kelebihan beban berbeda mencetak berbagai jenis data . Tidak ada
basic_ostream& operator<<( char value );
kelebihan untukstd::basic_ostream
dan itu dijelaskan di akhir halamanKelebihan non-anggota yang akan dipanggil saat Anda melewati
char
variabel adalahyang mencetak karakter di codepoint
ch
Jadi pada dasarnya jika Anda lulus
char
,signed char
atauunsigned char
langsung ke aliran itu akan mencetak karakter. Jika Anda mencoba menghapus+
pada baris di atas Anda akan melihat bahwa ia mencetak beberapa karakter "aneh" atau tidak terlihat yang tidak seperti yang diharapkan orang.Jika Anda ingin nilai-nilai numerik mereka bukannya Anda harus memanggil kelebihan untuk
short
,int
,long
ataulong long
. Cara termudah untuk melakukan ini adalah mempromosikan darichar
keint
dengan plus unary+
. Itu salah satunya langka yang berguna dari operator plus unary . Pemeran eksplisit untukint
juga akan bekerjaAda banyak orang yang menghadapi masalah itu pada SO suka
sumber