2014-10-07 17 views
6
#include <stdio.h> 

int main(void) 
{ 
    int a = 1, i = 3, x, y, z; 
    a = 1; i = 3; 
    x = a+++i; 
    a = 1; i = 3; 
    y = a++ + i; 
    a = 1; i = 3; 
    z = a + ++i; 
    printf("%d %d %d", x, y, z); 
    scanf(" "); 
    return 0; 
}  

Đầu ra mã này có vẻ là 4 4 5. Nhưng tại sao là a+++i tương đương với a++ + i?Là "a +++ i" bằng "(a ++) +" trong C

Có phải vì trình biên dịch luôn đọc mã nguồn từ trái sang phải không?

Hoặc là do hoạt động sau the order of precedence?

Và nó có hoạt động giống nhau trên tất cả các trình biên dịch không?

+0

Liên quan đến [Tại sao không +++++ b hoạt động trong C?] (Http://stackoverflow.com/q/5341202/1708801) –

Trả lời

5

chuẩn C11, phần 6.4 (Lexical elements)/4 nói (và trong C99 nó giống):

Nếu dòng đầu vào đã được phân tích thành tiền xử lý mã thông báo lên đến một nhân vật nhất định, tiếp theo thẻ tiền xử lý là chuỗi dài nhất các ký tự có thể tạo thành mã thông báo tiền xử lý .

Ngoài ra còn có một ví dụ có:

Chương trình đoạn x+++++y được phân tách như x ++ ++ + y, vi phạm một cản trở đối nhà khai thác tăng, mặc dù các phân tích cú pháp x ++ + ++ y có thể mang một biểu thức chính xác.

1

Tôi không thể nói hết, vì việc triển khai trình biên dịch C có thể khác nhau. Nhưng nói chung có, bạn nói đúng. Trình biên dịch C được cho là tham lam, tức là đọc nhiều nhất có thể, do đó, +++ == ++ +.

+0

Không tìm thấy mẫu trong C++? –

+0

Ah, bạn đã đúng! – Vin

Các vấn đề liên quan