Tại sao C không cho phép gán 2 xâu ký tự hoặc 2 mảng (kể cả cùng kích thước) nhưng lại cho phép gán 2 biến cấu trúc mặc dù trong đó có các trường là xâu ký tự hay mảng?

mọi người cho em hỏi: tại sao C không cho phép gán 2 xâu ký tự hoặc 2 mảng(kể cả cùng kích thước) nhưng lại cho phép gán 2 biến cấu trúc mặc dù trong đó có các trường là xâu ký tự hay mảng… ? Tại sao C lại làm như vậy

2 posts were merged into an existing topic: Topic chứa các reply được cho là off-topic - version 2

3 Likes

Chưa rõ câu hỏi của bạn.
Đa số trương hợp liên quan đến việc cố gắng gán 1 mảng này bằng 1 mảng kia la do chưa hiểu rõ về quản lý object trong bộ nhớ của c.
1 struct thì khác. a khi bạn tạo ra nó xem như là 1 object được tạo ra cái object đó được quản lý bởi 1 ai đó và toàn quyền truy cập đông thời thay đổi nó. Vì nguyên vùng nhớ đó
Là của bạn. Nhưng mảng thì khác nó chỉ quan tâm con trỏ đầu mảng… xâu chuỗi cũng vậy. Nó ko quản lý cả mảng đó.
Viêt trên điên thoại nên ko đưa eg được.

1 Like

cảm ơn anh. em đã hiểu phần ko thể gán mảng. Nhưng câu hỏi tại sao C lại làm nhu vậy thì e cũng ko hiểu ạ
. đây là 1 câu hỏi bài tập thầy em giao về.

1 Like

tại vì C ko cho phép. Mảng có thể coi như là 1 hằng giá trị (ko phải hằng con trỏ mà là hằng giá trị), chỉ thay đổi những phần tử mà nó chứa, bản thân nó ko thay đổi được. Gán x = ... thì bản thân x phải thay đổi được. Nếu x là mảng thì x ko thay đổi đc nên nó sẽ báo lỗi. Gán x[i] thì có thể được nếu x[i] ko phải là mảng.

http://en.cppreference.com/w/c/language/operator_assignment

The simple assignment operator expressions have the form
lhs = rhs

where
lhs - modifiable lvalue expression of any complete object type
rhs - expression of any type implicitly convertible to lhs or compatible with lhs

(ở đây lhs = left hand side nghĩa là vế trái, rhs = right hand side = vế phải)

kiểu rhs giống kiểu lhs chỉ là yêu cầu thứ hai (cho rhs) trong phép gán lhs = rhs, yêu cầu thứ nhất (cho lhs) là lhs phải là đối tượng thay đổi được (modifiable lvalue).

http://en.cppreference.com/w/c/language/value_category

Modifiable lvalue expressions

A modifiable lvalue is any lvalue expression of complete, non-array type which is not const-qualified, and, if it’s a struct/union, has no members that are const-qualified, recursively.

Only modifiable lvalue expressions may be used as arguments to increment/decrement, and as left-hand arguments of assignment and compound assignment operators.

trong định nghĩa của “Modifiable lvalue expressions” thì có ghi rõ nó ko phải là kiểu array => ko gán lhs = rhs được nếu lhs là array. Luật nó thế @@ Còn với struct/union thì nó cho phép với điều kiện ko có thành viên nào trong struct/union đó là hằng (đương nhiên rồi @@)

1 Like

thầy đã cho câu hỏi cho anh chưa anh? thầy Vượng cũng hỏi em câu tương tự

Mảng căn bản là con trỏ, không thể biết trước nó dài bao nhiêu. Sao mà gán trực tiếp được em

C không cho phép gán biến mảng với nhau bởi vì có quy tắc là mảng ở biểu thức sẽ được hiểu là con trỏ trỏ về giá trị đầu tiên của mảng (trường hợp ngoại lệ ví dụ như sizeof, &,…) nên khi này thành gán địa chỉ cho biến, mà vì không phải là con trỏ nên bạn không thể thay đổi địa chỉ của biến được. Còn đối với các kiểu dữ liệu khác như struct thì không có quy tắc này nên chỉ cần sao chép giá trị vào thôi (trừ khi struct có trường const thì không gán được).

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?