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

c

(Phong Sv) #1

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) #2

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


(Nguyễn Đình Anh) #3

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


(Phong Sv) #4

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


(Nguyễn Đình Anh) #5

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


Nhớ MarkDown code nhé :slight_smile:


(Phong Sv) #6

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


(‏) #7

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) #8

#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) #10

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


(*grab popcorn*) #11

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:


(rogp10) #12

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 ^^


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