Quy tắc xoắn ốc
C
29
C++
30
White

Bùi Hồng Hà viết ngày 23/05/2015

Quy tắc xoắn ốc

Có một quy tắc gọi là "quy tắc xoắn ốc" cho phép lập trình viên C/C++ phân tích trong đầu bất cứ khai báo nào. Quy tắc này rất đơn giản như sau:

  • Bắt đầu bằng tên biến và di chuyển xoắn ốc theo chiều kim đồng hồ.
  • Nếu gặp từ khóa const thì đối tượng nằm trên đường xoắn ốc trước const không đổi.
  • Nếu gập ký tự * thì đối tượng trước khi đến * là một con trỏ.
  • Nếu gặp [] thì đối tượng trước [] là một mảng.
  • Nếu gặp (kiểu dữ liệu 1, kiểu dữ liệu 2), đối tượng trước đó là một function.

Áp dụng

Ta tử áp dụng quy tắc trên để phân tích thử 1 số khai báo.

1. Khai báo đơn giản

                 +-------+
                 | +-+   |
                 | ^ |   |
            char *str[10];
             ^   ^   |   |
             |   +---+   |
             +-----------+

Ý nghĩa: str là một mảng (10 ký tự) con trỏ có kiểu dữ liệu ký tự (char).

2. Con trỏ hàm

          +--------------------+
          | +---+              |
          | |+-+|              |                    
          | |^ ||              |
     char *(*fp)( int, float *);
      ^   ^ ^  ||              |
      |   | +--+|              |
      |   +-----+              |
      +------------------------+

Ý nghĩa: fp là 1 con trỏ, trỏ đến 1 function (nhận 2 đối số là int, và con trỏ kiểu float), trả về 1 con trỏ có kiểu dữ liệu ký tự (char).

3. Const

  • Ví dụ 1

    char greeting[] = "Hello";
           +-----------------+
           |   +-----------+ |
           |   | +-------+ | |
           |   ^ ^       v | | 
    const char * p = greeting;
       ^   ^   ^         | | |
       |   |   |         | | |
       |   |   +---------+ | |
       |   +---------------+ |   
       +---------------------+
    

Ý nghĩa: p có giá trị giống greeting, và là 1 con trỏ, trỏ đến dữ liệu kiểu char, giá trị này là hằng số (không thay đổi).

  • Ví dụ 2

    char greeting[] = "Hello";
             +------------------------+   
             | +-------------------+  |
             | |     +-----------+ |  |
             | |     | +-------+ | |  |
             | |     ^ ^       v | |  |
    const char * const p = greeting;  |
       ^     ^ ^     ^         | | |  |
       |     | |     |         | | |  |
       |     | |     +---------+ | |  |
       |     | +-----------------+ |  |
       |     +---------------------+  |
       +------------------------------+
    

Ý nghĩa: p có giá trị giống greeting, giá trị của p không đổi, và nó là 1 con trỏ, trỏ đến dữ liệu kiểu chả, và dữ liệu của là hằng số.

Cuối cùng

Quy tắc xoắc ốc giúp ta hiểu ý nghĩa khai báo C/C++ một cách dễ dàng. Bây giờ với quy tắc này, bạn chắc chắn khai báo dưới đây dễ hiểu như ăn kẹo rồi phải không?
void (signal(int, void (fp)(int)))(int);

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Bùi Hồng Hà

59 bài viết.
297 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
79 8
Bài viết tổng hợp cơ chế hoạt động của https Chút ít về chữ ký điện tử Chữ ký điện tử là cơ chế bao gồm 3 thuật toán: Thuật toán chọn một khóa...
Bùi Hồng Hà viết hơn 3 năm trước
79 8
White
45 7
Giới thiệu Gần đây thấy bản thân chém gió rất nhiều về MapReduce, Hadoop v.v nhưng chưa thấy có bài viết nào tổng hợp + giải thích cụ thể về MapRe...
Bùi Hồng Hà viết gần 3 năm trước
45 7
White
37 0
Giới thiệu Google là một công ty dẫn đầu về phần mềm xử lý Big Data. Hầu hết các phần mềm xử lý dữ liệu như Hadoop đều có nguồn gốc ý tưởng từ Goo...
Bùi Hồng Hà viết gần 3 năm trước
37 0
Bài viết liên quan
White
3 1
Chú ý: Bài viết này trình bày chủ yếu cho CentOS 64 bit, tuy nhiên ý tưởng có thể áp dụng cho các hệ điều hành khác. Cuối bài có ghi chú cho Ubunt...
Ngoc Dao viết hơn 2 năm trước
3 1
Male avatar
0 0
Constructor của lớp cha luôn được gọi trước constructor của lớp con. class Foo { public: Foo() { cout << "Base class initializing" << endl; ...
baoquocphan viết hơn 1 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
59 bài viết.
297 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!