Kode berikut (diambil dari sini ):
int* ptr = int();
mengkompilasi dalam Visual C ++ dan menginisialisasi nilai penunjuk.
Bagaimana mungkin? Maksud saya int()
menghasilkan sebuah objek bertipe int
dan saya tidak dapat menetapkannya int
ke sebuah pointer.
Bagaimana kode di atas tidak ilegal?
c++
visual-c++
pointers
initialization
built-in-types
gigi tajam
sumber
sumber
int()
menghasilkan nilai nilai yang dibangunint
(yang menurut saya adalah hal yang ditentukan C ++ 03) dan nilai defaultint
adalah0
. Ini setara denganint *ptr = 0;
NULL
bisa menjadi nilai bukan nol. Saya mengatakan itu bisa berupa konstanta integer bernilai nol (yang mencakupint()
).Jawaban:
int()
adalah ekspresi konstanta dengan nilai 0, jadi ini cara yang valid untuk menghasilkan konstanta penunjuk nol. Pada akhirnya, itu hanya cara mengatakan yang sedikit berbedaint *ptr = NULL;
sumber
nullptr
, yang dapat Anda gunakan sebagai ganti0
atauNULL
dalam kode baru.0
dapat berarti konstanta penunjuk nol atau angka 0, sedangkannullptr
jelas merupakan konstanta penunjuk nol. Selain itu, seperti yang dikatakan Jamin, juga ada "pemeriksaan waktu kompilasi ekstra". Cobalah untuk berpikir sebelum mengetik.Karena
int()
hasil0
, yang dapat dipertukarkan denganNULL
.NULL
sendiri didefinisikan sebagai0
, tidak seperti CNULL
yang ada(void *) 0
.Perhatikan bahwa ini akan menjadi kesalahan:
int* ptr = int(5);
dan ini masih akan berhasil:
int* ptr = int(0);
0
adalah nilai konstanta khusus dan karenanya dapat diperlakukan sebagai nilai penunjuk. Ekspresi konstan yang menghasilkan0
, seperti1 - 1
juga diperbolehkan sebagai konstanta penunjuk-nol.sumber
(void *)0
juga. Ini hanyalah implementasi yang didefinisikan "ekspresi konstan integer dengan nilai 0, atau ekspresi seperti itu dilemparkan ke tipe void *".NULL
sebagai(void*)0
; itu selalu0
(atau mungkin0L
). (Tapi kemudian, pada saat C90(void*)0
dilegalkan di C, saya sudah menggunakan C ++.)#if !defined(__cplusplus) \n #define NULL ((void*)0) \n #else \n #define NULL (0)
versi gcc saat ini di ubuntu adalah 4.5, di sistem kami adalah 4.0.0
adalah literal khusus" - hanya karena ini adalah ekspresi konstan, dan memiliki nilai khusus 0.(1-1)
sama istimewanya, juga konstanta penunjuk nol, dan begitu jugaint()
. Fakta0
literal sudah cukup tetapi tidak perlu kondisi untuk menjadi ekspresi konstan. Sesuatu sepertistrlen("")
, meskipun juga memiliki nilai khusus0
, bukanlah ekspresi konstan dan karenanya bukan konstanta penunjuk nol.0
, bukan0
literal.Ekspresi
int()
mengevaluasi ke bilangan bulat default-diinisialisasi konstan, yang merupakan nilai 0. Nilai itu khusus: digunakan untuk menginisialisasi pointer ke status NULL.sumber
int f() { return 0; }
, ekspresif()
menghasilkan nilai 0, tetapi tidak dapat digunakan untuk menginisialisasi penunjuk.Dari n3290 (C ++ 03 menggunakan teks serupa), 4.10 Konversi penunjuk [konv.ptr] paragraf 1 (penekanannya ada pada saya):
int()
adalah ekspresi konstan integral dari tipe integer yang mengevaluasi ke nol (itu seteguk!), dan dengan demikian dapat digunakan untuk menginisialisasi tipe pointer. Seperti yang Anda lihat,0
itu bukan satu-satunya ekspresi integral yang dikurung khusus.sumber
Yah int bukanlah sebuah objek.
Saya percaya apa yang terjadi di sini adalah Anda memberi tahu int * untuk menunjuk ke beberapa alamat memori yang ditentukan oleh int ()
jadi jika int () membuat 0, int * akan menunjuk ke alamat memori 0
sumber
int()
pasti adalah sebuah objek.int()
. Definisikanint i;
, maka tidak ada pertanyaan,i
adalah sebuah objek.int
merupakan tipe, bukan objek. Apakahint()
menghasilkan suatu objek atau hanya nilai r tidak mempengaruhi apa pun yang dikatakan orang di tempat lain.