2011-02-03 34 views
5

Một trong những người bạn của tôi đã cho tôi xem chương trình này và hỏi tôi tại sao lại là i biến tăng gấp đôi.Tại sao biến "i" lại tăng dần hai lần trong chương trình của tôi?

Theo hiểu biết của tôi MAX(i++, ++j); trong dòng này i là lần đầu tiên gửi như một tham số và sau đó tăng lên, vì vậy nếu các giá trị ban đầu của i10 thì giá trị tăng lên nên 11, nhưng nó cho thấy giá trị tăng lên của i như 12 .

Chương trình:

#include<stdio.h> 

#define MAX(x,y) (x)>(y)?(x):(y) 

void main(void) 
{ 
    int i = 10; 
    int j = 5; 
    int k = 0; 

    k = MAX(i++, ++j); 

    printf("%d %d %d",i,j,k); 
} 

Output:

một người nào đó có thể vui lòng giải thích cho tôi như thế nào là giá trị tăng lên đến 12?

Cảm ơn.

+2

Cũng nên nhớ rằng 'main' nên trả về một 'int'! – peoro

+1

Chắc chắn, đây phải là bản sao của một số câu hỏi trước đó? –

+0

@larsmans Có thể tôi và tôi thậm chí không biết chính xác tìm kiếm loại vấn đề này. – Searock

Trả lời

5

Thay thế macro của bạn có nghĩa là bạn viết (i++)>(++j)?(i++):(++j).

8

MAX là macro, không phải là hàm. Trong trường hợp sử dụng của bạn, nó mở rộng tới:

k = (i++) > (++j) ? (i++) : (++j); 
5

định nghĩa macro của bạn có chứa các đối số hai lần

#define MAX(x,y) (x)>(y)?(x):(y) 

Mà làm cho

k = MAX(i++, ++j); 

mở rộng để

k = (i++)>(++j)?(i++):(j++); 

Và như vậy, , tăng gấp đôi.

2

Macro làm thay văn bản đơn giản, vì vậy sau khi mở rộng vĩ mô, dòng k = MAX(i++, ++j); được xem bởi trình biên dịch như:

k = (i++)>(++j)?(i++):(++j); 
2

MAX nở vĩ mô của bạn để

(i++)>(++j)?(i++):(++j) 

cho thấy lý do tại sao bạn có được một đôi tăng.

4

MAX không phải là chức năng. i không được gửi dưới dạng tham số.

MAX là macro. Nó được thay thế bằng văn bản khi được sử dụng:

k = (i++)>(j++)?(i++):(j++) 

Bây giờ bạn đã biết tại sao số lượng này tăng gấp đôi.

1

Khi sử dụng MAX(i++, ++j), các mã được tạo sẽ là:

(i++) > (++j) ? (i++) : (++j) 

Sử dụng tiền xử lý vĩ mô chỉ mở rộng mã và sao chép/dán các đối số tại chỗ. Bạn có thể muốn sử dụng một hàm cho trường hợp này.

int max(int x, int y) 
{ 
    return (x > y ? x : y); 
} 

Trình biên dịch hiện đại sẽ nội tuyến trong khi tôn trọng hành vi gốc của lệnh gọi hàm.

2

vĩ mô sẽ được mở rộng đến một cái gì đó giống như trong mã pseudo-C:

if(i++ > j++) // i is incremented the first time, j is incremented once 
    return i++; // i is incremented the second time 
else 
    return j++; // we never go there, so j is not incremented twice 
Các vấn đề liên quan