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 !

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

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

1 Like

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

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


Nhớ MarkDown code nhé :slight_smile:

1 Like

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

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

2 Likes

#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
3 Likes

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

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:

3 Likes

Phải thêm dấu ngoặc ngoài ((i)*(i)) cho chắc cú khi đi kèm những toán tử có độ ưu tiên cao hơn.
Dấu ngoặc trong là cho toán tử có độ ưu tiên thấp hơn [phép nhân].

Ta muốn cả tham số và macro không bị xen vào bởi các toán tử có độ ưu tiên cao hơn chúng, thì chỉ có bọc trong cặp ngoặc đơn thôi. Hoặc là viết hàm ^^

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?