Mengapa C dan C ++ mengizinkan ekspresi (int) + 4 * 5?

87
(int) + 4*5;

Mengapa ini (menambahkan tipe dengan nilai) mungkin? (dicoba dengan g ++ dan gcc.)

Saya tahu itu tidak masuk akal (dan tidak berpengaruh), tetapi saya ingin tahu mengapa ini mungkin.

Ernest Bredar
sumber
19
sama seperti(int)-4*5
P__J mendukung wanita di Polandia
45
Ada sebuah alat berguna bernama cppinsightsyang membantu untuk memahami bagaimana kode terlihat dari perspektif frontend compiler. Ini juga memiliki versi online, Anda dapat melihat apa yang diceritakannya tentang contoh Anda ('tanda kurung' yang sama dengan jawaban yang Anda berikan)
Nikita Kniazev
22
Pernyataan ini setara dengan +(int)+ 4*5;dan -(int)- 4*5;dan -+-+-(int)-+-+- 4*5;dan kurang puitis;
chqrlie
16
Bagian apa yang membuatmu bingung? Sejauh yang saya tahu, Anda bertanya mengapa Anda diizinkan untuk menulis 5 tanpa menunjukkan tandanya.
Carsten S
5
Bukankah C ++ harus memperingatkan Anda bahwa cast tipe C tidak direkomendasikan di C ++?
Tn. Lister

Jawaban:

141

The +sini adalah unary +operator yang , bukan operator tambahan biner . Tidak ada tambahan yang terjadi di sini.

Juga, sintaks (int)digunakan untuk typecasting.

Anda dapat membaca kembali pernyataan itu sebagai

(int) (+ 4) * 5;    

yang diuraikan sebagai

((int) (+ 4)) * (5);    

yang mengatakan,

  1. Terapkan +operator unary pada nilai konstanta integer 4.
  2. typecast ke sebuah int
  3. kalikan dengan operan 5

Ini mirip dengan (int) (- 4) * (5);, di mana penggunaan operator unary lebih dikenal.

Dalam kasus Anda, unary +dan cast to int- keduanya berlebihan.

Sourav Ghosh
sumber
50
"Mentransmisi", bukan "typecasting". Typecasting adalah sesuatu yang terjadi pada aktor.
Keith Thompson
8
(+ 4)tidak membuat operand+4 , itu berarti menerapkan unary +ke operand 4, yang memang merupakan no-op dalam kasus OP, tetapi dapat menyebabkan promosi integer atau kerusakan array dalam keadaan lain. Misalnya char c = 0; sizeof +c == sizeof cmungkin salah dan sizeof +"a"mungkin bukan 2.
chqrlie
7
"keduanya mubazir" - semuanya mubazir, seperti 42;:-)
paxdiablo
11
Saya tidak melihat ada yang salah dengan istilah Type Casting. Sepertinya aku bukan satu-satunya .
Ben
14
@Ben Typecasting bukan tipe casting.
Kenneth K.
40

Ini diartikan sebagai ((int)(+4)) * 5. Yaitu, ekspresi +4(operator plus unary diterapkan ke literal 4), cast untuk mengetik intdengan cast gaya C, dan hasil dikalikan dengan 5.

Igor Tandetnik
sumber