Sử dụng index âm trong mảng của ngôn ngữ C
C
27
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

21 bài viết.
53 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
17 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 2 năm trước
17 15
White
16 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 1 năm trước
16 1
White
13 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 1 năm trước
13 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 gần 2 năm trước
3 1
White
17 2
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 hơn 2 năm trước
17 2
White
6 0
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 gần 2 năm trước
6 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


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