Sử dụng index âm trong mảng của ngôn ngữ C
C
29
White

Hoàng Minh Trung viết ngày 03/11/2015

Trong các ngôn ngữ đời mới như ruby hay python thì đều có index là âm

array = [:a, :b, :c, :d, :e]
array[-1] # => :e

Về idea thì indices trong array của các ngôn ngữ mới đều được hình dung dưới dạng circle, tức là nếu bị âm n thì sẽ tương đương với index array#length - n.

Vậy trong C thì sao nhỉ, vì index của mảng trong array của C dựa vào vị trí pointer, thế nên index âm chắc là không thể có trong C rồi.
Mình cũng nghĩ vậy, cơ mà thực ra nó lại có thể T_T

Theo như chuẩn C (C standard C99) tại đây, thì

989 The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).

Có nghĩa là giá trị của E1[E2] sẽ tương đương với giá trị tại con trỏ ((E1)+(E2)). Tức là nếu E2 < 0, đồng thời E1 đang trỏ đến một vị trí lớn hơn trị tuyệt đối của E2: |E2| , thì con trỏ tạo bởi (E1) + (E2) sẽ trỏ đến một vị trí hoàn toàn "hợp pháp", như trong ví dụ dưới đây:

int arr[10];
int* p = &arr[2];

int x = p[-2];

Vậy có thể kết luận là: index với giá trị âm có thể tồn tại trong C!!

Tuy nhiên có một chú ý nhỏ theo như tham khảo trong bài viết Be Careful of Negative Array Indices, là việc thao tác với index với giá trị âm trong hệ thống 64 bit (hay chính là việc "trừ" con trỏ) có thể dẫn đến các kết quả không mong muốn.

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

Hoàng Minh Trung

23 bài viết.
65 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
22 1
Bài viết dịch từ http://arslan.io/tenusefultechniquesingo Sử dụng một GOPATH duy nhất Sử dụng đồng thời nhiều GOPATH sẽ không giúp cho hệ thống ...
Hoàng Minh Trung viết hơn 2 năm trước
22 1
White
19 15
(Ảnh) Mục đích của bài viết là hướng dẫn cơ bản nhất cho những ai chưa biết về docker, môi trường thực hiện là mac OS. Chuẩn bị Cài đặt virtua...
Hoàng Minh Trung viết hơn 3 năm trước
19 15
White
17 0
Bài viết dịch từ https://github.com/luciotato/golangnotes/blob/master/OOP.md Mục đích bài viết Học golang dễ dàng hơn với những kiến thức bạn đ...
Hoàng Minh Trung viết hơn 2 năm trước
17 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
White
19 5
Gần đây tôi có dịp đụng vào CMake, nên có tìm hiểu một chút về nó. Hy vọng có ích cho anh em. Nó cung cấp tính năng sinh ra Makefile một cách hiệu...
Phùng Văn Tú viết 3 năm trước
19 5
White
8 1
Xử lí song song từ xa xưa cho đến gần đây là lãnh vực cao cấp hầu như chỉ dành cho các nhà khoa học. Có ít nhất 2 nguyên nhân: Xử lí song song đòi...
Ngoc Dao viết hơn 2 năm trước
8 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
23 bài viết.
65 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á!