Saya baru mengenal c. Di sini didefinisikan makro sebagai #define val 4+2. ketika mencoba mencetak persegi menggunakan val*val itu memberikan output sebagai 14 alih-alih 36. Bagaimana ini terjadi, tetapi ketika makro didefinisikan sebagai #define val 6 ia memberikan keluaran yang benar. Berikut adalah cuplikan kode sampel. Adakah yang bisa menjelaskan mengapa demikian?

#define max 4+2

int main()
{
   printf("%d\n",max);    
   int i = max*max;
   printf("%d\n",i);
}

Keluaran: 6 14

1
Sandeep M Nath 29 Desember 2020, 13:04

3 jawaban

Jawaban Terbaik

Pernyataan

int i = max*max;

Berkembang menjadi

int i = 4 + 2 * 4 + 2;

Yang setara dengan

int i = 4 + (2 * 4) + 2;

Jika Anda ingin hasilnya

int i = (4 + 2) * (4 + 2);

Maka Anda perlu menambahkan tanda kurung secara eksplisit di makro:

#define max (4+2)

Ini adalah "cacat" umum dengan makro, dan salah satu alasan penggunaannya tidak disarankan, atau hanya digunakan untuk nilai konstanta yang sangat sederhana.

2
Some programmer dude 29 Desember 2020, 10:07

Makro adalah pengganti teks "bodoh", tanpa pemahaman semantik. Jika Anda mengganti "max" dengan "4+2" (yang dilakukan oleh praprosesor), Anda akan melihat inisialisasi i diselesaikan sebagai:

int i = 4+2*4+2;

Dari sini, lebih mudah untuk melihat bahwa hasilnya adalah 4+2*4+2=4+8+2=14.

Jika Anda ingin max mewakili 6 "jalan yang sulit", Anda dapat mengapitnya dengan tanda kurung:

#define max (4+2)

Dengan cara ini, preprosesor akan menyelesaikan:

int i = (4+2)*(4+2);

Dan Anda akan mendapatkan i=36 seperti yang Anda harapkan.

0
Mureinik 29 Desember 2020, 10:09

Setelah menjalankan kode Anda melalui pra-prosesor (gcc -E)

//removing the content from stdio.h for brevity...

int main()
{
   printf("%d\n",4+2);   // output : 6, as expected
   int i = 4+2*4+2;      // note the expansion here, not what you'd expect!
   printf("%d\n",i);     // value of 'i' is not what you'd expect!
}

Jadi, untuk menguraikan pernyataan seperti

 int i = 4+2*4+2;

Secara efektif sama dengan

int i = (4) + (2*4) + (2) ;

Yang menghasilkan output 14, bukan 36, karena kurangnya prioritas operator yang didukung tanda kurung, prioritas default sedang bekerja dan dijalankan seperti yang ditunjukkan di atas.

Saran: Selalu bungkus makro Anda dalam tanda kurung untuk menghindari hal ini.

0
Sourav Ghosh 29 Desember 2020, 10:14