Xin chào mọi người, em mới học về ngôn ngữ C++. Khi học đến bài toán tử thì tài liệu có đề cập đến khái niệm “side effect”, mọi người có thể giải thích cho em khái niệm này dựa vào những kiến thức cơ bản được không ạ, tại vì em cũng chưa học được nhiều C++. Em cảm ơn.
Giải thích về "Side effect" trong C++
Có hình không bạn? Nói side effect thì chung chung quá, mình không hiểu.
side-effect
là ngoại trừ giá trị trả về và các tham số trong hàm bị thay đổi, các giá trị khác mà ko thuộc hàm này bị thay đổi nghĩa là có side-effect :V
ví dụ
- hàm
swap(int& a, int& b)
thì sau khi swap a, b, giá trị các biến bên ngoài hàm
thay đổi nghĩa là nó có side effect :V -
++i
trả về giá trịi+1
nhưng có tăngi
sau đó lên 1 đơn vị nghĩa là có side-effect -
i++
trả về giá trịi
nhưng có tăngi
sau đó lên 1 đơn vị nghĩa là cũng có side-effect
có thể nói hàm cần tham chiếu (&
hoặc con trỏ *
) và có sửa giá trị của tham chiếu đó = side effect :V
thậm chí chỉ truyền bằng tham trị, copy cũng có thể có side effect :V Ví dụ 1 const object x
nhưng nó có con trỏ p
trỏ tới biến khác thì tuy hàm ko thay đổi giá trị của object x
(x.p
ko đổi) nhưng x.setPvalue(int val) { *p = val; }
có thể sửa giá trị mà con trỏ đó trỏ tới thì cũng có side effect :V
#include <iostream>
struct S {
int* p;
void setPvalue(int val) const { *p = val; }
};
void foo(const S x) {
x.setPvalue(22);
}
int main() {
int n = 11;
S a{&n};
foo(a);
std::cout << n; // in ra 22
}
side effect này trong lập trình đa luồng xử lý rất mệt :V Các ngôn ngữ ko có side effect như functional programming thì vì ko có side effect nên đa luồng rất nhẹ nhàng :V
Em không có hình gì ạ, tại đang học về phần toán tử của C++ thì họ nói về “side effect”, nhưng cái định nghĩa đó khó hiểu quá, cả về tiếng Anh lẫn tiếng Việt ạ. Em cũng search cả StackOverflow, họ còn lấy các ví dụ về Pointers, … Nhưng mấy cái đó em chưa học ạ
Không biết có ai có ví dụ nào dễ hiểu không ạ?
Mình thấy lạ thôi, thường thì side effect là nói tới function, mà ở trên bạn lại đọc được ở phần toán tử??? Mình muốn clear chỗ này nên mới nhờ bạn chụp ảnh (hoặc screenshot) phần tài liệu này lên để xem thêm.
@Vuio Đây là link phần đó. Ở cuối có nói về “side effect” ạ
https://www.learncpp.com/cpp-tutorial/increment-decrement-operators-and-side-effects/
Ví dụ bạn có một hàm gọi là CalculateAge, hàm này nhận vào birthday và trả ra tuổi. Nhưng vì lý do gì đó, người viết hàm này không những trả ra tuổi mà họ còn thay đổi luôn giá trị của birthday. Sau khi bạn gọi CalculateAge(birthday), birthday bây giờ không còn là ngày sinh lúc đầu nữa, điều mà bạn không ngờ. Phần in đậm gọi là side effect. Có những side effect được cố tình viết, cũng có cái do vô tình. Nhưng nhìn chung nó là nguyên nhân của rất nhiều bug.
A function or expression is said to have a side effect if it does anything that persists beyond the life of the function or expression itself.
Với biến x
, x = 5
là một biểu thức vừa trả về x
, mà vừa gán 5 vào x
(side effect). Thực ra toán tử ++
và --
cũng vừa trả về giá trị, vừa thay đổi biến.
Thấy ví dụ này trong link cũng hài.
x = 5; // the assignment operator modifies the state of x
Side-effect là tác dụng chính, main effect là tác dụng phụ?
bản thân là hàm set
nhưng lại có const
nhưng mà quan trọng là const
ở đây ảo thật đấy =)))
Ví dụ hay
[intro.execution] luôn
Accessing an object designated by a volatile glvalue (3.10), modifying an object, calling a library I/O function, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment.