Toán tử bậc ba c++
Tài liệu này đóng vai trò là định nghĩa đầy đủ về các tiêu chuẩn viết mã của Google cho mã nguồn bằng Ngôn ngữ lập trình Java™. Một tệp nguồn Java được mô tả là ở trong Google Style khi và chỉ khi nó tuân thủ các quy tắc ở đây Show
Giống như các hướng dẫn về phong cách lập trình khác, các vấn đề được đề cập không chỉ bao gồm các vấn đề thẩm mỹ về định dạng mà còn cả các loại quy ước hoặc tiêu chuẩn viết mã khác. Tuy nhiên, tài liệu này tập trung chủ yếu vào các quy tắc cứng rắn và nhanh chóng mà chúng tôi tuân theo trên toàn cầu và tránh đưa ra lời khuyên không thể thực thi rõ ràng (dù là do con người hay công cụ) 1. 1 Ghi chú thuật ngữTrong tài liệu này, trừ khi được giải thích khác
"Ghi chú thuật ngữ" khác thỉnh thoảng sẽ xuất hiện trong toàn bộ tài liệu 1. 2 Ghi chú hướng dẫnMã ví dụ trong tài liệu này là phi quy chuẩn. Nghĩa là, trong khi các ví dụ ở trong Google Style, chúng có thể không minh họa cách duy nhất để thể hiện mã. Các lựa chọn định dạng tùy chọn được thực hiện trong các ví dụ không nên được thực thi như các quy tắc 2 Thông tin cơ bản về tệp nguồn2. 1 Tên tệpTên tệp nguồn bao gồm tên phân biệt chữ hoa chữ thường của lớp cấp cao nhất mà nó chứa (trong đó có chính xác một), cộng với phần mở rộng // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}3 2. 2 Mã hóa tập tin. UTF-8Các tệp nguồn được mã hóa bằng UTF-8 2. 3 ký tự đặc biệt2. 3. 1 Ký tự khoảng trắngNgoài trình tự kết thúc dòng, ký tự khoảng cách ngang ASCII (0x20) là ký tự khoảng trắng duy nhất xuất hiện ở bất kỳ đâu trong tệp nguồn. Điều này ngụ ý rằng
2. 3. 2 Trình tự thoát hiểm đặc biệtĐối với bất kỳ ký tự nào có một chuỗi thoát đặc biệt ( // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}4, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}5, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}6, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}7, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}8, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}9, MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);0 và MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);1), chuỗi đó được sử dụng thay vì bát phân tương ứng (e. g. MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);2) hoặc Unicode (e. g. MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);3) trốn thoát 2. 3. 3 ký tự không phải ASCIIĐối với các ký tự không phải ASCII còn lại, ký tự Unicode thực tế (e. g. MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);4) hoặc lối thoát Unicode tương đương (e. g. MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);5) được sử dụng. Sự lựa chọn chỉ phụ thuộc vào việc làm cho mã dễ đọc và dễ hiểu hơn, mặc dù Unicode thoát ra bên ngoài chuỗi ký tự và nhận xét không được khuyến khích Mẹo. Trong trường hợp thoát Unicode và đôi khi ngay cả khi các ký tự Unicode thực được sử dụng, một nhận xét giải thích có thể rất hữu ích ví dụ Ví dụThảo luậnMyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);6Tốt nhất. hoàn toàn rõ ràng ngay cả khi không có bình luận. MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);7Được phép, nhưng không có lý do gì để làm điều này. MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);8Được phép, nhưng vụng về và dễ mắc sai lầm. MyLambda lambda = (String label, Long value, Object obj) -> { ... }; Predicate predicate = str -> longExpressionInvolving(str);9Nghèo. người đọc không biết đây là gì. // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}80Tốt. sử dụng các lối thoát cho các ký tự không in được và nhận xét nếu cần Mẹo. Đừng bao giờ làm cho mã của bạn khó đọc hơn chỉ vì sợ rằng một số chương trình có thể không xử lý đúng các ký tự không phải ASCII. Nếu điều đó xảy ra, những chương trình đó bị hỏng và chúng phải được sửa 3 Cấu trúc tệp nguồnMột tệp nguồn bao gồm, theo thứ tự
Chính xác một dòng trống ngăn cách mỗi phần có mặt 3. 1 Giấy phép hoặc thông tin bản quyền, nếu cóNếu thông tin giấy phép hoặc bản quyền thuộc về một tệp, thì nó thuộc về đây 3. 2 Tuyên bố góiCâu lệnh gói không được ngắt dòng. Giới hạn cột (Mục 4. 4, Giới hạn cột. 100) không áp dụng cho câu lệnh gói 3. 3 Báo cáo nhập khẩu3. 3. 1 Không nhập ký tự đại diệnNhập ký tự đại diện, tĩnh hoặc cách khác, không được sử dụng 3. 3. 2 Không ngắt dòngCâu lệnh nhập không được ngắt dòng. Giới hạn cột (Mục 4. 4, Giới hạn cột. 100) không áp dụng cho câu lệnh nhập 3. 3. 3 Thứ tự và khoảng cáchNhập khẩu được đặt hàng như sau
Nếu có cả nhập tĩnh và không tĩnh, một dòng trống sẽ phân tách hai khối. Không có dòng trống nào khác giữa các câu lệnh nhập Trong mỗi khối, các tên đã nhập xuất hiện theo thứ tự sắp xếp ASCII. (Ghi chú. điều này không giống với các câu lệnh nhập theo thứ tự sắp xếp ASCII, vì '. ' sắp xếp trước ';'. ) 3. 3. 4 Không nhập tĩnh cho các lớpNhập tĩnh không được sử dụng cho các lớp lồng nhau tĩnh. Chúng được nhập khẩu với hàng nhập khẩu bình thường 3. 4 Khai báo lớp3. 4. 1 Chính xác một khai báo lớp cấp cao nhấtMỗi lớp cấp cao nhất nằm trong một tệp nguồn của riêng nó 3. 4. 2 Thứ tự nội dung lớp họcThứ tự bạn chọn cho các thành viên và người khởi tạo lớp học của bạn có thể có ảnh hưởng lớn đến khả năng học hỏi. Tuy nhiên, không có công thức chính xác duy nhất về cách thực hiện; Điều quan trọng là mỗi lớp sử dụng một số trật tự logic mà người bảo trì của nó có thể giải thích nếu được hỏi. Ví dụ: các phương thức mới không chỉ được thêm vào cuối lớp theo thói quen, vì điều đó sẽ tạo ra thứ tự "thứ tự thời gian theo ngày được thêm vào", đây không phải là thứ tự logic 3. 4. 2. 1 quá tải. không bao giờ chiaCác phương thức của một lớp có cùng tên xuất hiện trong một nhóm liền kề duy nhất không có thành viên nào khác ở giữa. Điều tương tự cũng áp dụng cho nhiều hàm tạo (luôn có cùng tên). Quy tắc này áp dụng ngay cả khi các công cụ sửa đổi như // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}81 hoặc // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}82 khác nhau giữa các phương thức 4 Định dạngLưu ý thuật ngữ. cấu trúc giống như khối đề cập đến phần thân của một lớp, phương thức hoặc hàm tạo. Lưu ý rằng, theo Mục 4. 8. 3. 1 trên các trình khởi tạo mảng, bất kỳ trình khởi tạo mảng nào cũng có thể tùy chọn được xử lý như thể nó là một cấu trúc giống như khối 4. 1 niềng răng4. 1. 1 Sử dụng niềng răng tùy chọnDấu ngoặc nhọn được sử dụng với các câu lệnh // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}83, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}84, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}85, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}86 và // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}87, ngay cả khi phần thân trống hoặc chỉ chứa một câu lệnh duy nhất Các dấu ngoặc nhọn tùy chọn khác, chẳng hạn như các dấu ngoặc nhọn trong biểu thức lambda, vẫn là tùy chọn 4. 1. 2 khối rỗng. phong cách K & RNiềng răng theo kiểu Kernighan và Ritchie ("dấu ngoặc Ai Cập") cho các khối không trống và các cấu trúc giống như khối
Ngoại lệ. Ở những nơi mà các quy tắc này cho phép một câu lệnh kết thúc bằng dấu chấm phẩy ( // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}89), một khối câu lệnh có thể xuất hiện và dấu ngoặc mở của khối này được đặt trước dấu ngắt dòng. Các khối như thế này thường được giới thiệu để giới hạn phạm vi của các biến cục bộ, ví dụ như bên trong các câu lệnh chuyển đổi ví dụ // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}8 Một vài ngoại lệ cho các lớp enum được đưa ra trong Phần 4. 8. 1, Các lớp liệt kê 4. 1. 3 khối trống. có thể ngắn gọnMột khối trống hoặc cấu trúc giống như khối có thể theo kiểu K & R (như được mô tả trong Phần 4. 1. 2). Ngoài ra, nó có thể được đóng lại ngay sau khi được mở, không có ký tự hoặc ngắt dòng ở giữa ( // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}90), trừ khi nó là một phần của câu lệnh nhiều khối (câu lệnh chứa trực tiếp nhiều khối. // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}91 hoặc // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}92) ví dụ // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}2____0 4. 2 Khối thụt đầu dòng. +2 dấu cáchMỗi khi một khối mới hoặc cấu trúc giống như khối được mở, phần thụt lề sẽ tăng thêm hai khoảng trắng. Khi khối kết thúc, thụt lề trở về mức thụt lề trước đó. Mức thụt lề áp dụng cho cả mã và nhận xét trong toàn bộ khối. (Xem ví dụ ở Mục 4. 1. 2, Khối rỗng. Phong cách K & R. ) 4. 3 Một câu lệnh trên mỗi dòngMỗi câu lệnh được theo sau bởi một dấu ngắt dòng 4. 4 Giới hạn cột. 100Mã Java có giới hạn cột là 100 ký tự. Một "ký tự" có nghĩa là bất kỳ điểm mã Unicode nào. Ngoại trừ như được lưu ý bên dưới, bất kỳ dòng nào vượt quá giới hạn này đều phải được ngắt dòng, như được giải thích trong Phần 4. 5, Line-wrapping Mỗi điểm mã Unicode được tính là một ký tự, ngay cả khi độ rộng hiển thị của nó lớn hơn hoặc nhỏ hơn. Ví dụ: nếu sử dụng các ký tự có độ rộng đầy đủ, bạn có thể chọn ngắt dòng sớm hơn khi quy tắc này yêu cầu nghiêm ngặt ngoại lệ
4. 5 Đóng gói dòngLưu ý thuật ngữ. Khi mã có thể chiếm một dòng một cách hợp pháp được chia thành nhiều dòng, hoạt động này được gọi là ngắt dòng Không có công thức toàn diện, xác định nào chỉ ra chính xác cách ngắt dòng trong mọi tình huống. Rất thường có một số cách hợp lệ để ngắt dòng cùng một đoạn mã Ghi chú. Mặc dù lý do điển hình của việc ngắt dòng là để tránh vượt quá giới hạn cột, nhưng ngay cả mã thực tế phù hợp với giới hạn cột cũng có thể được ngắt dòng theo quyết định của tác giả Mẹo. Trích xuất một phương thức hoặc biến cục bộ có thể giải quyết vấn đề mà không cần phải ngắt dòng 4. 5. 1 Nơi để phá vỡChỉ thị chính của line-wrapping là. thích phá vỡ ở cấp độ cú pháp cao hơn. Cũng thế
Ghi chú. Mục tiêu chính của việc ngắt dòng là có mã rõ ràng, không nhất thiết là mã phù hợp với số lượng dòng nhỏ nhất 4. 5. 2 dòng tiếp tục thụt lề ít nhất +4 dấu cáchKhi ngắt dòng, mỗi dòng sau dòng đầu tiên (mỗi dòng tiếp theo) được thụt vào ít nhất +4 so với dòng gốc Khi có nhiều dòng tiếp tục, thụt đầu dòng có thể thay đổi ngoài +4 như mong muốn. Nói chung, hai dòng tiếp tục sử dụng cùng một mức thụt đầu dòng khi và chỉ khi chúng bắt đầu bằng các yếu tố song song về mặt cú pháp phần 4. 6. 3 về Căn chỉnh theo chiều ngang giải quyết thực tiễn không khuyến khích sử dụng một số lượng khoảng trắng khác nhau để căn chỉnh các mã thông báo nhất định với các dòng trước đó 4. 6 Khoảng trắng4. 6. 1 Khoảng trắng dọcMột dòng trống duy nhất luôn xuất hiện
Một dòng trống duy nhất cũng có thể xuất hiện ở bất cứ đâu giúp cải thiện khả năng đọc, ví dụ như giữa các câu lệnh để tổ chức mã thành các tiểu mục hợp lý. Một dòng trống trước thành viên hoặc bộ khởi tạo đầu tiên, hoặc sau thành viên hoặc bộ khởi tạo cuối cùng của lớp, không được khuyến khích cũng như không khuyến khích Nhiều dòng trống liên tiếp được cho phép, nhưng không bao giờ bắt buộc (hoặc khuyến khích) 4. 6. 2 Khoảng trắng ngangNgoài những nơi được yêu cầu bởi ngôn ngữ hoặc các quy tắc kiểu khác và ngoài chữ, nhận xét và Javadoc, một không gian ASCII duy nhất cũng chỉ xuất hiện ở những nơi sau
Quy tắc này không bao giờ được hiểu là yêu cầu hoặc cấm thêm khoảng trắng ở đầu hoặc cuối dòng; 4. 6. 3 Căn ngang. không bao giờ bắt buộcLưu ý thuật ngữ. Căn chỉnh theo chiều ngang là cách thêm một số khoảng trắng bổ sung có thể thay đổi vào mã của bạn với mục tiêu làm cho một số mã thông báo nhất định xuất hiện ngay bên dưới một số mã thông báo khác trên các dòng trước đó Phương pháp này được cho phép nhưng Google Style không bao giờ yêu cầu. Thậm chí không bắt buộc phải duy trì căn chỉnh ngang ở những nơi nó đã được sử dụng Đây là một ví dụ không có căn chỉnh, sau đó sử dụng căn chỉnh // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}8 Mẹo. Căn chỉnh có thể hỗ trợ khả năng đọc, nhưng nó tạo ra các vấn đề cho việc bảo trì trong tương lai. Xem xét một thay đổi trong tương lai chỉ cần chạm vào một dòng. Thay đổi này có thể khiến định dạng hài lòng trước đây bị xáo trộn và điều đó được cho phép. Thông thường, nó cũng nhắc người viết mã (có thể là bạn) điều chỉnh khoảng trắng trên các dòng gần đó, có thể kích hoạt một loạt định dạng lại xếp tầng. Thay đổi một dòng đó hiện có "bán kính vụ nổ. " Điều này tệ nhất có thể dẫn đến công việc bận rộn vô ích, nhưng tốt nhất thì nó vẫn làm hỏng thông tin lịch sử phiên bản, làm chậm trình đánh giá và làm trầm trọng thêm xung đột hợp nhất 4. 7 Nhóm dấu ngoặc đơn. khuyến khíchCác dấu ngoặc nhóm tùy chọn chỉ được bỏ qua khi tác giả và người đánh giá đồng ý rằng không có khả năng mã sẽ bị hiểu sai nếu không có chúng, cũng như chúng sẽ không làm cho mã dễ đọc hơn. Sẽ không hợp lý nếu cho rằng mọi trình đọc đều ghi nhớ toàn bộ bảng ưu tiên của toán tử Java 4. 8 Cấu trúc cụ thể4. 8. 1 lớp EnumSau mỗi dấu phẩy theo sau hằng số enum, ngắt dòng là tùy chọn. Các dòng trống bổ sung (thường chỉ một dòng) cũng được phép. Đây là một khả năng // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}9 Một lớp enum không có phương thức và không có tài liệu về hằng số của nó có thể được định dạng tùy chọn như thể nó là một trình khởi tạo mảng (xem Phần 4. 8. 3. 1 trên bộ khởi tạo mảng) // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}1 Vì các lớp enum là các lớp, nên áp dụng tất cả các quy tắc khác để định dạng lớp 4. 8. 2 Khai báo biến4. 8. 2. 1 Một biến trên mỗi khai báoMỗi khai báo biến (trường hoặc cục bộ) chỉ khai báo một biến. khai báo như // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}21 không được sử dụng Ngoại lệ. Nhiều khai báo biến được chấp nhận trong tiêu đề của vòng lặp // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}85 4. 8. 2. 2 Khai báo khi cần thiếtCác biến cục bộ không được khai báo theo thói quen khi bắt đầu khối chứa hoặc cấu trúc giống như khối của chúng. Thay vào đó, các biến cục bộ được khai báo gần với điểm chúng được sử dụng lần đầu tiên (với lý do), để giảm thiểu phạm vi của chúng. Khai báo biến cục bộ thường có bộ khởi tạo hoặc được khởi tạo ngay sau khi khai báo 4. 8. 3 mảng4. 8. 3. 1 Trình khởi tạo mảng. có thể là "giống như khối"Bất kỳ trình khởi tạo mảng nào cũng có thể được định dạng tùy chọn như thể nó là một "cấu trúc giống như khối. " Ví dụ: tất cả những điều sau đây đều hợp lệ (không phải là danh sách đầy đủ) // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}2 4. 8. 3. 2 Không khai báo mảng kiểu CDấu ngoặc vuông tạo thành một phần của loại, không phải biến. // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}23, không phải // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}24 4. 8. 4 Câu lệnh chuyển đổiLưu ý thuật ngữ. Bên trong dấu ngoặc nhọn của khối chuyển đổi là một hoặc nhiều nhóm câu lệnh. Mỗi nhóm câu lệnh bao gồm một hoặc nhiều nhãn chuyển đổi (hoặc là // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}25 hoặc là // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}26), tiếp theo là một hoặc nhiều câu lệnh (hoặc, đối với nhóm câu lệnh cuối cùng, không có hoặc nhiều câu lệnh) 4. 8. 4. 1 thụt đầu dòngNhư với bất kỳ khối nào khác, nội dung của khối chuyển đổi được thụt vào +2 Sau nhãn chuyển đổi, có một ngắt dòng và mức thụt đầu dòng được tăng lên +2, chính xác như thể một khối đang được mở. Nhãn công tắc sau trở về mức thụt đầu dòng trước đó, như thể một khối đã bị đóng 4. 8. 4. 2 Fall-thông qua. nhận xétTrong một khối chuyển đổi, mỗi nhóm câu lệnh hoặc kết thúc đột ngột (với một ngoại lệ // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}27, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}28, // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}29 hoặc bị ném), hoặc được đánh dấu bằng một nhận xét để chỉ ra rằng việc thực thi sẽ hoặc có thể tiếp tục trong nhóm câu lệnh tiếp theo. Bất kỳ nhận xét nào truyền đạt ý tưởng về sự thất bại là đủ (thường là // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}200). Chú thích đặc biệt này không bắt buộc trong nhóm câu lệnh cuối cùng của khối chuyển đổi. Ví dụ // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}3 Lưu ý rằng không cần chú thích sau // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}201, chỉ ở cuối nhóm câu lệnh 4. 8. 4. 3 Sự hiện diện của nhãn |