2015-01-01 19 views
6

Đó là K & R-C và đây là toàn bộ mã: http://v6shell.org/history/if.cTại sao bạn quay lại (0 * ap ++)?

Nhìn vào chức năng này:

char *nxtarg() { 
    if (ap>ac) return(0*ap++); 
    return(av[ap++]); 
} 

1.Question: Tại sao lợi nhuận (0 * ap ++)? Được rồi bạn muốn trả về 0 và tăng ap lên 1. Nhưng tại sao lại như thế này? Nó có nhanh hơn if (ap>ac) {ap++; return 0;} không?

2.Question: Kiểu trả về của nxtarg phải là char *, tại sao bạn có thể trở về 0, một số nguyên?

+0

Vui lòng tách câu hỏi của bạn thành hai. Vì đã có câu trả lời cho câu hỏi đầu tiên, tôi khuyên bạn nên rút lại câu trả lời thứ hai. –

+4

(Vì bạn có phong cách mã hóa khủng khiếp?) Nghiêm túc, đừng làm thế. –

+2

Mã bạn đã quyết định xem xét vì một lý do nào đó là một ví dụ rất kém về thực hành C hiện đại, ngay cả khi nó là sở thích lịch sử. Bạn có thể đặt một câu hỏi cho mỗi và mọi chức năng trong tập tin đó và không tìm hiểu bất cứ điều gì hữu ích trong quá trình này. Hoặc bạn có thể tìm thấy mã tốt hơn để đọc. Tôi sẽ giới thiệu mã nguồn của musl: http://www.musl-libc.org –

Trả lời

7

Đây là một mẹo nhỏ để ép số gia tăng vào một câu lệnh trả về 0. Đó là một cách logic tương đương với một điều kiện

if (ap > ac) { 
    ap++; 
    return 0; 
} 

hoặc thậm chí tốt hơn với một comma operator:

return (ap++, (char *)0); // Thanks, Jonathan Leffler 

Lưu ý rằng kể từ zero trong ví dụ của bạn không phải là một thời gian biên dịch liên tục, khái niệm cần một dàn diễn viên được tuân thủ tiêu chuẩn:

if (ap>ac) return (char*)(0*ap++); 

Khi quay trở lại số nguyên không, nó được coi là bằng NULL con trỏ khi được sử dụng trong po bối cảnh nội bộ.

+0

Đây không phải là con trỏ NULL vì '0 * ap ++' không phải là một biểu thức liên tục. Việc chuyển đổi trong mã OP đòi hỏi một dàn diễn viên theo tiêu chuẩn C. Mặt khác, mã được cung cấp trong câu trả lời này tuân thủ nghiêm ngặt. – mafso

+0

@mafso Cảm ơn bạn rất nhiều vì đã bình luận! Tôi đã chỉnh sửa câu trả lời để phản ánh quan điểm về chuyển đổi được yêu cầu. Cảm ơn! – dasblinkenlight

+0

Ngay cả với dàn diễn viên, tôi không chắc chắn hành vi được xác định rõ (mặc dù tôi chắc chắn rằng nó hoạt động tốt trong thực tế). –

2

Toán tử ++ sẽ tăng giá trị và trả về giá trị trước khi tăng. Nếu hàm được cho là trả về một con trỏ, bạn có thể trả về số không hoặc NULL, để chỉ ra con trỏ NULL.

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