#include <stdio.h>
volatile int i;
int main()
{
int c;
for (i = 0; i < 3; i++)
{
c = i &&& i;
printf("%d\n", c);
}
return 0;
}
Output dari program di atas dikompilasi menggunakan gcc
adalah
0
1
1
Dengan opsi -Wall
atau -Waddress
, gcc
mengeluarkan peringatan:
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
Bagaimana c
dievaluasi dalam program di atas?
c++
c
operators
compiler-optimization
gcc-warning
manav mn
sumber
sumber
i && (&i)
? Menarik bahwa saya tidak dapat menemukan pos rangkap di SO.while (i &&& i <-- j) {}
.Jawaban:
Itu
c = i && (&i);
, dengan bagian kedua menjadi mubazir, karena&i
tidak akan pernah dievaluasifalse
.Untuk tipe yang ditentukan pengguna, di mana Anda sebenarnya bisa kelebihan beban unary
operator &
, mungkin berbeda, tapi itu masih ide yang sangat buruk .Jika Anda menghidupkan peringatan , Anda akan mendapatkan sesuatu seperti:
sumber
c = i & (&&i);
; Di manai
ada label?i
didefinisikan sebagaiint
dan tidak ada label dalam pertanyaan. Juga, maksimum mengunyah ...&&
operator untuk mengambil alamat label adalah ekstensi gcc yang tidak standar. Tetapi bahkan jika itu standar, aturan mengunyah maksimal akan mencegahnya diurai seperti itu (kecuali Anda memasukkan spasi).&i
bisa dievaluasifalse
. Terkadang digunakan untuk default. Contoh:void fn(type& x = *reinterpret_cast<type*>(NULL));
Berapakah nilai&x
infn
jikafn
dipanggil tanpa parameter? Ini 0 alias salah. Namun, dengan menggunakan cara yang dijelaskan, itu akan selalu benar kecualii == 0
, dan jika seseorang menggunakannya seperti yang saya jelaskan, itu akan menjadi benarc = &i && i
.Tidak ada
&&&
operator atau token dalam C. Tetapi operator&&
(logis "dan") dan&
(unary address-of atau bitwise "dan") memang ada.Dengan aturan mengunyah maksimal , ini:
setara dengan ini:
Set
c
ke 1 jika keduanyai
dan&i
benar, dan ke 0 jika salah satu dari keduanya salah.Untuk int, nilai bukan nol adalah benar. Untuk sebuah pointer, nilai non-null apa pun adalah benar (dan alamat suatu objek selalu non-nol). Begitu:
Ini diatur
c
ke 1 jikai
tidak nol, atau0
jikai
sama dengan nol.Yang menyiratkan bahwa
&&&
sedang digunakan di sini hanya untuk kebingungan yang disengaja. Tugas mungkin termasuk salah satu dari yang berikut:sumber