01/10/2018, 15:39

Cách tính của && và ||

while (T.level(s.peek().charAt(0)) >= T.level(c) && !s.isEmpty() ) {
	s1 += s.peek();
	s.pop();
}

Trong đoạn code này khi mình để !s.isEmpty thì code báo lỗi còn để lên trước thì lại không bị lỗi. Đây là lỗi:
Exception in thread “main” java.util.EmptyStackException
** at java.util.Stack.peek(Unknown Source)**
** at spoj.Transform_The_Expression.Postfix(Transform_The_Expression.java:50)**
** at spoj.Transform_The_Expression.main(Transform_The_Expression.java:70)**

rogp10 viết 17:46 ngày 01/10/2018

Khi kết quả đã ngã ngũ thì &&|| đều thoát sau khi tính toán hạng thứ nhất. (gọi là short-circuit evaluation) Vì vậy toán hạng 1 phải có isEmpty mới đúng.

Bình Vũ viết 17:40 ngày 01/10/2018

Nghĩa là sao mình chưa hiểu lắm

vũ xuân quân viết 17:43 ngày 01/10/2018

Đầu tiên bạn coi thứ tự thực hiện phép so sánh của && và ||.
&& và || đều thực hiện phép so sánh từ trái qua phải.

Biểu thức (T.level(s.peek().charAt(0)) >= T.level(c) && !s.isEmpty() )
sẽ bị Exception khi giá trị của biến s là empty vì biểu thức T.level(s.peek().charAt(0)) >= T.level© sẽ thực hiện trước.

Bài liên quan
0