Apa tujuan dari "+" unary sebelum panggilan ke std :: numeric_limits anggota <unsigned char>?

130

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?

Zhang
sumber
3
Cobalah. Apa yang Anda dapatkan jika Anda meninggalkan +?
Pete Becker
4
Pertanyaan ini tidak perlu menjadi penanya jika penulis kode peduli untuk menjelaskan apa artinya atau menggunakan pemeran eksplisit sebagai gantinya ...
user202729
jika Anda mengganti dengan -maka output tidak akan menjadi nilai yang benar untuk batas
phuclv
1
Sebagai catatan, jika Anda ingin Google hal semacam ini dalam diri Anda, ini disebut "unary plus" operator - ini unary karena mengambil nilai tunggal (dalam hal ini, hal yang tepat setelah itu), dan "plus "adalah cara yang ramah Google untuk mengatakan +. 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.
Dana Monica's Lawsuit

Jawaban:

137

Operator keluaran <<ketika dilewatkan char(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 operator unsigned chardikembalikan oleh fungsi-fungsi ke intmelalui promosi bilangan bulat . Yang berarti nilai integer akan dicetak sebagai gantinya.

Ekspresi suka +std::numeric_limits<unsigned char>::lowest()pada dasarnya sama dengan static_cast<int>(std::numeric_limits<unsigned char>::lowest()).

Beberapa programmer Bung
sumber
37

+apakah ada untuk mengubah unsigned charmenjadi int. 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 yang operator <<akan dicetak saat diberi jenis karakter.

StoryTeller - Unslander Monica
sumber
18

Hanya dengan menambahkan referensi ke jawaban yang sudah diberikan. Dari draft kerja standar CPP N4713 :

8.5.2.1 Operator unary
...

  1. Operand dari operator unary + harus memiliki aritmatika, enumerasi yang tidak dioprasi, atau tipe pointer dan hasilnya adalah nilai argumen. Promosi integral dilakukan pada operan integral atau enumerasi. Jenis hasilnya adalah jenis operan yang dipromosikan.

Dan char, short, int, dan longadalah jenis yang tidak terpisahkan.

PW
sumber
12

Tanpa +hasilnya akan berbeda. Cuplikan berikut menghasilkan a 97bukannyaa a

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

Alasannya adalah karena kelebihan beban berbeda mencetak berbagai jenis data . Tidak ada basic_ostream& operator<<( char value );kelebihan untuk std::basic_ostreamdan itu dijelaskan di akhir halaman

Argumen string karakter dan karakter (misalnya tipe char atau const char*) akan ditangani oleh overloads non-anggota dari operator<<. Mencoba mengeluarkan karakter menggunakan sintaks panggilan fungsi anggota (mis., std::cout.operator<<('c');) Akan memanggil salah satu dari kelebihan (2-4) dan mengeluarkan nilai numerik . Mencoba mengeluarkan string karakter menggunakan sintaks panggilan fungsi anggota akan memanggil overload (7) dan mencetak nilai pointer sebagai gantinya.

Kelebihan non-anggota yang akan dipanggil saat Anda melewati charvariabel adalah

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

yang mencetak karakter di codepoint ch

Jadi pada dasarnya jika Anda lulus char, signed charatau unsigned charlangsung 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, longatau long long. Cara termudah untuk melakukan ini adalah mempromosikan dari charke intdengan plus unary +. Itu salah satunya langka yang berguna dari operator plus unary . Pemeran eksplisit untuk intjuga akan bekerja

Ada banyak orang yang menghadapi masalah itu pada SO suka

phuclv
sumber
1
Apakah maksud Anda unary plus , bukan minus?
Ruslan