Sự khác biệt giữa những người khác! == và và = =! [đóng cửa]


162

Hôm qua tôi đã vấp phải điều này khi tôi sửa đổi mã PHP được viết bởi người khác. Tôi đã bị bối rối rằng một so sánh đơn giản ( if ($var ==! " ")) không hoạt động như mong đợi. Sau một số thử nghiệm tôi nhận ra rằng bất cứ ai đã viết mã đó được sử dụng ==!thay vì !==làm toán tử so sánh. Tôi chưa bao giờ thấy ==!trong bất kỳ ngôn ngữ nào vì vậy tôi tự hỏi làm thế nào mã này thậm chí có thể hoạt động và đã thực hiện một số thử nghiệm:

<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>

Điều này tạo ra đầu ra này:

int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)

Toán tử dường như làm việc cho các biến boolean và số nguyên, nhưng không phải cho các chuỗi. Tôi không thể tìm thấy ==!trong tài liệu PHP hoặc bất cứ điều gì về nó trên bất kỳ công cụ tìm kiếm nào (đã thử Google, Bing, DuckDuckGo, nhưng tôi nghi ngờ họ cố gắng diễn giải nó thay vì tìm kiếm chuỗi ký tự). Có ai nhìn thấy điều này trước đây và có thể làm sáng tỏ hành vi này?


57
Thôi nào ... với những gì đang diễn ra? Tôi có thể làm thêm hàng tá câu hỏi như thế này. Và đi kèm với họ bằng cách phân tích nghiêm túc. Đây là bài tập thực hành sách giáo khoa tiêu chuẩn, không. Trong SO, chúng tôi bỏ phiếu cho chất lượng và thông tin, không phải để vui chơi và giải trí.
sehe

51
@sehe Anh ấy nhận được sự ủng hộ vì định nghĩa của một câu hỏi được nghiên cứu kỹ lưỡng - anh ấy đã "tìm kiếm một câu trả lời", "cụ thể", câu hỏi "có liên quan đến người khác" và là "về chủ đề". OP đã thử mọi thứ và cho chúng tôi thấy những gì anh ấy đã thử; Đây là loại câu hỏi mà trang web này cố gắng thúc đẩy
JRaymond

11
@JRaymond: anh ấy đang nhận được sự ủng hộ vì đó là một câu hỏi nhỏ cho một vấn đề và câu trả lời rất dễ hiểu. Khía cạnh đố làm tăng sự tò mò khiến nhiều người tham gia hơn, và khía cạnh dễ dàng làm tăng tỷ lệ những người hiểu câu hỏi và câu trả lời đủ để bỏ phiếu cho nó. Nó không liên quan đến nó có phải là một câu hỏi hay hay không.
Thomas Bonini

4
@JRaymond, thừa nhận nó, hầu hết các câu hỏi bỏ phiếu cao câu đố. Hãy xem ba câu hỏi của tôi trong số nhiều câu hỏi khác: 1 , 2 , 3 . Không ai trong số chúng là thứ bạn có thể tìm thấy trên google (không giống như hầu hết các câu hỏi bỏ phiếu cao) và chúng được suy nghĩ kỹ và cố gắng trước khi được viết (tôi biết, vì tôi đã viết chúng). Tuy nhiên, vì chúng là những câu hỏi đòi hỏi chuyên môn, họ không bao giờ nhận được số phiếu cao. Đó chỉ là cách hệ thống ở đây hoạt động.
Shahbaz

3
@JRaymond sehe nói đúng. Nhà văn sẽ có một ngày thực địa về SO. Tôi khuyên bạn nên truy cập danh sách này ( php.net/quickref.php ) và đưa ra các vấn đề thú vị trong đó chức năng là giải pháp. Tình huống hoặc chức năng càng mơ hồ và thú vị thì càng có nhiều phiếu bầu.
Mike B

Câu trả lời:


243

Sự khác biệt là không có nhà điều hành ==!.

Biểu thức này:

$a ==! $b

Về cơ bản là giống như thế này:

$a == (!$b)

10
Wow, rất nhiều câu trả lời tốt trong một thời gian ngắn như vậy. Tôi chọn câu trả lời đầu tiên làm rõ rằng! áp dụng cho biến tay phải và do đó có giá trị nhất. Xin lỗi cho những người khác;)
Gerald Schneider

4
@Gerald Schneider: Điều tối thiểu bạn có thể làm để bù lại là cải thiện câu trả lời này sao cho nó ít nhất ngang bằng với các câu trả lời khác về ngữ pháp và định dạng (một trong số đó bạn đặc biệt gọi ra để giải thích rất chi tiết !). Nhưng không sao, tôi đã chỉnh sửa nó ngay.
BoltClock

Tôi thậm chí không lập trình trong PHP và thậm chí tôi nhận ra rằng "==!" sẽ được đọc là 2 toán tử "==" và "!". Nó chỉ cho thấy mức độ ảnh hưởng của một chút bố cục có thể có đối với cách bạn đọc một cái gì đó.
StarNamer

2
@Bang Dao Um, JavaScript? Nó có === và! ==. Nhưng không ==!
psr

2
@BangDao Bây giờ bạn đã tìm thấy một lý do khác cho w3fools Vui lòng đọc nó, nó rất quan trọng.
một số

77

Không có ==!toán tử trong PHP

Nó chỉ là sự kết hợp của ==!. Chỉ có nhà điều hành có liên quan hiện diện ở đây là ==. Vì vậy, sự kết hợp ==!sẽ hoạt động như bình thường ==, kiểm tra Equalityvà tin tưởng tôi,

$variable_a ==! $variable_b 

không ai khác

$variable_a == (!$variable_b)

và như vậy;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")

true ==! false: bool(true)
true ==! true: bool(false)

Kết hợp nhiều ký tự toán tử có thể không hoạt động như một toán tử luôn. ví dụ, nếu chúng ta lấy =!, nó sẽ chỉ hoạt động như các toán tử nếu nó nằm trong mẫu của !=hoặc !==. Có thể có nhiều kết hợp với những nhân vật như !====, !==!vv .. vv .. kết hợp điều hành phải ở trong định dạng độc đáo , đơn hàng duy nhất , kết hợp độc đáo (tất cả các nhân vật wont kết hợp với tất cả các nhân vật khác) và chắc chắn, mà không cần bất kỳ không gian giữa chúng .

Kiểm tra danh sách các nhà khai thác dưới đây;

nhập mô tả hình ảnh ở đây


2
Tôi rơi vào ảo tưởng tương tự có thể sử dụng a <table>.
Chad Harrison

+ gần như nghĩ rằng đó là một cái bàn ... nhưng thực ra nó là một hình ảnh
Baba

38

==! không phải là một toán tử mà là hai:

==!

! có mức độ ưu tiên cao hơn ==

Vì thế :

"a" !== " ": bool(true) -> đúng vì "a" thực sự không bằng ""

"a" ==! " ": bool(false) -> sai vì "a" không bằng! ""

Có thể được viết với khoảng trắng giữa == và !.


1
false because "a" is not equals to !" "! "" có nghĩa là bỏ qua bool và phủ nhận rằng "" là đúng và! "" là sai.
Zaffy

@quarry Có, tôi đã không đi quá nhiều vào phần giải thích: p
Michael Laffargue

29

==!không tồn tại như vậy. Đó là một ký hiệu hơi khó hiểu về== !

Vì các không gian không quan trọng trong các hoạt động đó, bạn có thể dễ dàng viết a --> b, đánh giá a-- > b, nhưng sẽ trông lạ.

Vì vậy, như câu hỏi: "a" ==! " "sẽ được phân tích cú pháp "a" == !" ". Phủ định của một chuỗi được bao phủ bằng cách đúc , có nghĩa là bất kỳ chuỗi nào, "0"" ", khi được đúc , true.

Do đó, biểu thức "a" == !" "sẽ được chuyển:

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true

Và, như string "a"không giống như bool true, điều này đánh giá toàn bộ biểu thức false.

Vì vậy, những gì đạo đức của câu chuyện? Đừng để bản thân bị bối rối bởi thiếu hoặc đặt sai chỗ! :)


3
Không giống như đã nêu trong câu trả lời này, "a" == true đánh giá là đúng vì một chuỗi không trống được chuyển thành giá trị boolean true. Biểu thức "a" === true sẽ đánh giá thành false.
Pascal Rosin

25

==! không phải là một nhà điều hành

==!hoàn toàn không phải là toán tử so sánh php - nó giống như == !(lưu ý khoảng trắng)

I E

if ("a" !== " ") {
    // evaluates to true - "a" and " " are not equal
}

if ("a" == !" ") {
    // unreachable
} else {
    // evaluates to false - "a" is not equal to true (!" " evaluates to true)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.