Có, nó bắt buộc (cả thứ tự đánh giá và ngắn mạch). Trong ví dụ của bạn nếu tất cả các hàm trả về true, thứ tự của các cuộc gọi hoàn toàn từ functionA rồi functionB và sau đó là functionC. Được sử dụng cho như thế này
if(ptr && ptr->value) {
...
}
Tương tự cho toán tử dấu phẩy:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
Một nói giữa bên trái và bên phải của toán hạng &&
, ||
, ,
và giữa người đầu tiên và thứ hai / toán hạng thứ ba của ?:
(nhà điều hành có điều kiện) là một "điểm chuỗi". Bất kỳ tác dụng phụ được đánh giá hoàn toàn trước thời điểm đó. Vì vậy, điều này là an toàn:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
Lưu ý rằng toán tử dấu phẩy không được nhầm lẫn với dấu phẩy cú pháp được sử dụng để phân tách các thứ:
// order of calls to a and b is unspecified!
function(a(), b());
Tiêu chuẩn C ++ nói trong 5.14/1
:
Các nhóm toán tử && từ trái sang phải. Các toán hạng đều được chuyển đổi hoàn toàn thành kiểu bool (mệnh đề 4). Kết quả là đúng nếu cả hai toán hạng đều đúng và sai. Không giống như &, && đảm bảo đánh giá từ trái sang phải: toán hạng thứ hai không được đánh giá nếu toán hạng thứ nhất sai.
Và trong 5.15/1
:
| | nhóm vận hành từ trái sang phải. Các toán hạng đều được chuyển đổi hoàn toàn thành bool (mệnh đề 4). Nó trả về true nếu một trong hai toán hạng của nó là true và ngược lại là false. Không giống như |, || đảm bảo đánh giá từ trái sang phải; hơn nữa, toán hạng thứ hai không được đánh giá nếu toán hạng thứ nhất đánh giá là đúng.
Nó nói cho cả hai bên cạnh những người:
Kết quả là một bool. Tất cả các tác dụng phụ của biểu thức thứ nhất ngoại trừ phá hủy tạm thời (12.2) xảy ra trước khi biểu thức thứ hai được ước tính.
Thêm vào đó, 1.9/18
nói
Trong đánh giá của từng biểu thức
a && b
a || b
a ? b : C
a , b
sử dụng ý nghĩa tích hợp của các toán tử trong các biểu thức này (5.14, 5.15, 5.16, 5.18), có một điểm thứ tự sau khi đánh giá biểu thức đầu tiên.