Hỏi về cách thức compiler chạy câu lệnh sau

Cho em hỏi là mỗi instruction, compiler nó sẽ đọc toán tử trước rồi tính sau hay là đọc tới đâu tính tới đó ạ , vì như ví dụ dưới đây nó tính tới x && xong nó thấy x = 0 nó dừng luôn, nếu mà theo độ tiên của toán tử thì đáng lẽ ra nó phải thực hiến phép toàn trong dấu () trước chứ?

#include <stdio.h>

int main(void)
{
    int x = 0;
    int y = x && ( x|=10 );
    printf("%d\n", y);
    printf("%d\n", x);
}

Google search để biết
Cây ast

1 Like

do trong C++ nó bảo đảm logical AND thực hiện vế trái trước rồi mới quyết định có thực hiện vế phải tiếp hay là ko, ko bao giờ vế phải được tính trước.

Logical AND:

This operator is short-circuiting: if the first operand is true, the second operand is not evaluated.

short-circuiting:

Short-circuit operators are, in effect, control structures rather than simple arithmetic operators, as they are not strict. In imperative language terms (notably C and C++), where side effects are important, short-circuit operators introduce a sequence point – they completely evaluate the first argument, including any side effects, before (optionally) processing the second argument.

Sequence point

Between evaluation of the left and right operands of the && (logical AND), || (logical OR) (as part of short-circuit evaluation), and comma operators. For example, in the expression *p++ != 0 && *q++ != 0 , all side effects of the sub-expression *p++ != 0 are completed before any attempt to access q .

nên hiểu nó như là cách viết tắt của if else ấy :V a && b có thể hiểu là if (a) { if (b) {...} } nên dù có a && (b) đi nữa thì nó cũng thực hiện như 2 câu lệnh if lồng nhau if (a) if ((b)) thôi :V

5 Likes

Operator precedence là để đặt dấu ngoặc đơn thôi :slight_smile:
Left-to-right là tính chất kết hợp :slight_smile: cái này thì đã có 1 câu hỏi về ternary operator.
Còn toán hạng nào được tính trước là bất định (undetermined).

4 Likes

&& hay || thì ko có bất định như + - * / đâu :V Vế trái luôn luôn được tính trước :V

p && *p là cách người ta thường dùng để kiểm tra nếu p khác null thì mới deref nó, bảo đảm vế trái gọi trước vế phải, ko có vụ bất định đâu :V
https://docs.microsoft.com/en-us/cpp/cpp/logical-and-operator-amp-amp?view=vs-2019

You can use this short-circuit evaluation to prevent null-pointer dereferencing, as shown in the following example:
C++

char *pch = 0;
...
(pch) && (*pch = 'a');

If pch is null (0), the right side of the expression is never evaluated. Therefore, the assignment through a null pointer is impossible.

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