01/10/2018, 16:30

Thắc mắc khó giải thích macro trong C

Mình có đoạn code như sau và không hiểu vì sao khi in ra giá trị sqr(1+3) lại là 7 chứ không phải là 16

    #include <stdio.h>

    #define sqr(i) i*i

    int main(void) {
    	// your code goes here
    	int i =10;
    	printf("%d %d",sqr(3),sqr(1+3));
    	return 0;
   }

Cảm ơn mọi người !

Phong Sv viết 18:43 ngày 01/10/2018

Mọi người giúp mình với !

Nguyễn Đình Anh viết 18:35 ngày 01/10/2018

Đừng chụp màn hình, post hẳn Code lên bạn nhé.

Phong Sv viết 18:46 ngày 01/10/2018

vâng ! mình đang tạo lại topic mới

Nguyễn Đình Anh viết 18:41 ngày 01/10/2018

Topic có thể chỉnh sửa được nhé ! Không cần tạo topic mới !


Nhớ MarkDown code nhé

Phong Sv viết 18:42 ngày 01/10/2018

Còn nhiều cái phải học quá :((

viết 18:44 ngày 01/10/2018

macro trong C có sao viết vậy, bạn định nghĩa sqr(i)i*i thì nó sẽ viết y như vậy. Khi bạn gọi sqr(1+3) thi i ở đây sẽ là 1+3, i*i nó hiểu là 1+3*1+3 nên ra giá trị là 7

sửa macro lại, thêm đóng mở ngoặc bao quanh i thành #define sqr(i) (i)*(i) là được

HK boy viết 18:36 ngày 01/10/2018

#define là định nghĩa cái này bằng cái khác.

Bạn viết code như vậy không khác gì gọi

sqr(3) = 3*3
sqr(1+3) = 1+3*1+3 = 7

Để có kết quả chính xác, bạn có thể viết hàm

int sqr(x) {
    return x*x;
}

hoặc define kiểu khác

#define sqr(x) (x*x) // thêm cái ngoặc vào
Phong Sv viết 18:36 ngày 01/10/2018

Mình hiểu rồi …Cảm ơn bạn nhé

*grab popcorn* viết 18:32 ngày 01/10/2018

3 posts were merged into an existing topic: Topic chứa các reply được cho là off-topic - version 2

Câu hỏi về i++ + ++i + +i + i-- + --i Do hỏi quá nhiều nên mình move sang off-topic
Giải đáp rất kỹ ở đây:

em có thể lên https://godbolt.org/ xem nó biên dịch ra mã máy thế nào int function() { int i = 1; return ++i + ++i + i; } x86-64 GCC -O0 nó biên dịch ra function: push rbp mov rbp, rsp mov DWORD PTR [rbp-4], 1 add DWORD PTR [rbp-4], 1 add DWORD PTR [rbp-4], 1 mov eax, DWORD PTR [rbp-4] lea edx, [rax+rax] mov eax, DWORD PTR [rbp-4] add eax, edx pop rbp …

Bài liên quan
0