ความแตกต่างระหว่าง“! ==” และ“ ==!” [ปิด]


162

เมื่อวานนี้ฉันสะดุดเมื่อฉันแก้ไขโค้ด PHP ที่เขียนโดยคนอื่น ฉันรู้สึกงุนงงว่าการเปรียบเทียบแบบธรรมดา ( if ($var ==! " ")) ไม่ทำงานอย่างที่คาดไว้ หลังจากการทดสอบบางฉันรู้ว่าใครก็ตามที่เขียนรหัสที่ใช้==!แทนการ!==เป็นผู้ดำเนินการเปรียบเทียบ ฉันไม่เคยเห็น==!ในภาษาใดเลยฉันจึงสงสัยว่ารหัสนี้จะทำงานได้อย่างไรและทำการทดสอบ:

<?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");
?>

สิ่งนี้สร้างผลลัพธ์นี้:

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)

โอเปอเรเตอร์ดูเหมือนจะทำงานกับตัวแปรบูลีนและเลขจำนวนเต็ม แต่ไม่ใช่สำหรับสตริง ฉันไม่พบ==!ในเอกสาร PHP หรือสิ่งใด ๆ เกี่ยวกับมันในเครื่องมือค้นหาใด ๆ (ลองใช้ Google, Bing, DuckDuckGo แต่ฉันคิดว่าพวกเขาพยายามตีความมันแทนที่จะค้นหาสตริงตัวอักษร) มีใครเคยเห็นสิ่งนี้มาก่อนและจะทำให้เข้าใจถึงพฤติกรรมนี้ได้บ้าง


57
มา ... สิ่งที่มี upvotes? ฉันสามารถสร้างคำถามเพิ่มเติมอีกโหลนี้ได้ และมาพร้อมกับพวกเขาโดยการวิเคราะห์อย่างจริงจังเสมือน นี่คือแบบฝึกหัดแบบฝึกหัดตำรามาตรฐาน ใน SO เราให้คะแนนคุณภาพและข้อมูลไม่ใช่เพื่อความสนุกสนานและความบันเทิง
sehe

51
@ sehe เขาได้รับการโหวตเพราะคำจำกัดความของคำถามที่ได้รับการวิจัยเป็นอย่างดี - เขามี "ค้นหาคำตอบอย่างละเอียด", "ถูกเฉพาะ", คำถามคือ "เกี่ยวข้องกับคนอื่น" และ "อยู่ในหัวข้อ" OP ได้ลองสิ่งต่าง ๆ และแสดงให้เราเห็นว่าเขาพยายามอะไร ชนิดของคำถามเว็บไซต์นี้พยายามที่จะส่งเสริมให้เกิดการ
JRaymond

11
@JRaymond: เขาได้รับการโหวตเพราะมันเป็นคำถามเรื่องไม่สำคัญสำหรับปัญหาและคำตอบที่เข้าใจง่าย เรื่องไม่สำคัญเพิ่มความอยากรู้อยากเห็นซึ่งผลักดันให้ผู้คนเข้ามามากขึ้นและด้านง่ายเพิ่มเปอร์เซ็นต์ของคนเหล่านั้นที่เข้าใจคำถามและคำตอบที่พอที่จะลงคะแนน มันไม่เกี่ยวข้องกับการเป็นคำถามที่ดีหรือไม่
โทมัส Bonini

4
@JRaymond ยอมรับว่าคำถามที่มีคะแนนสูงสุดส่วนใหญ่เป็นเรื่องไม่สำคัญ ลองดูที่ทั้งสามคำถามของฉันในหมู่อื่น ๆ อีกมากมาย: 1 , 2 , 3 ไม่มีพวกเขาเป็นสิ่งที่คุณสามารถหาได้ใน google (ไม่เหมือนคำถามที่ได้คะแนนโหวตสูงที่สุด) และพวกเขาก็มีความคิดดีและลองก่อนเขียน (ฉันรู้เพราะฉันเขียน) อย่างไรก็ตามเนื่องจากเป็นคำถามที่ต้องใช้ความเชี่ยวชาญจึงไม่เคยได้รับคะแนนสูง นี่เป็นวิธีการทำงานของระบบที่นี่
Shahbaz

3
@JRaymond sehe ถูกต้อง นักเขียนจะมีข้อมูลวันที่ดังนั้น ฉันขอแนะนำให้ลงรายการนี้ ( php.net/quickref.php ) และหาปัญหาที่น่าสนใจที่ฟังก์ชั่นนั้นเป็นทางออก ยิ่งทำให้สถานการณ์หรือฟังก์ชั่นการออกเสียงลงคะแนนชัดเจนยิ่งขึ้น
Mike B

คำตอบ:


243

==!ความแตกต่างก็คือว่ามีผู้ประกอบการไม่มี

สำนวนนี้:

$a ==! $b

โดยพื้นฐานแล้วเป็นเช่นนี้:

$a == (!$b)

10
ว้าวคำตอบที่ดีมากในช่วงเวลาสั้น ๆ ฉันเลือกคำตอบแรกที่ได้ชี้แจงว่า! นำไปใช้กับตัวแปรด้านขวามือและดังนั้นจึงมีค่ามากที่สุด ขออภัยสำหรับคนอื่น ๆ ;)
Gerald Schneider

4
@ เจอรัลด์ชไนเดอร์: อย่างน้อยที่สุดที่คุณสามารถทำได้เพื่อปรับปรุงคำตอบนี้เพื่อให้อย่างน้อยก็ตรงกับคำตอบอื่น ๆ ในแง่ของไวยากรณ์และการจัดรูปแบบ (อย่างใดอย่างหนึ่งที่คุณเรียกใช้โดยเฉพาะ !) แต่ไม่ว่าฉันจะแก้ไขมันตอนนี้
BoltClock

ฉันทำโปรแกรมไม่ได้แม้ใน PHP และแม้ฉันตระหนักว่า "==!" จะถูกอ่านเป็นตัวดำเนินการ 2 ตัว "==" และ "!" มันแสดงให้เห็นว่าเอฟเฟ็กต์เลย์เอาต์เล็ก ๆ น้อย ๆ นั้นมีผลต่อการที่คุณอ่านอะไร
StarNamer

2
@ Bang Dao อืมจาวาสคริปต์? มันมี === และ! == แต่ไม่ ==!
psr

2
@ BangDao ตอนนี้คุณพบเหตุผลอื่นสำหรับw3foolsโปรดอ่านมันเป็นสิ่งสำคัญ
บาง

77

ไม่มีเป็น==!ผู้ประกอบการใน PHP

มันเป็นเพียงแค่การรวมกันของและ== !เพียง ==แต่ในปัจจุบันผู้ประกอบการที่เกี่ยวข้องที่นี่คือ ดังนั้นชุดค่าผสม==!จะทำงานได้ตามปกติ==ตรวจสอบEqualityและเชื่อใจฉัน

$variable_a ==! $variable_b 

ไม่มีใครนอกจาก

$variable_a == (!$variable_b)

และดังนั้น;

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

และ

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

รวมผู้ประกอบการหลายตัวละครอาจไม่ทำงานเป็นผู้ดำเนินการเสมอ ตัวอย่างเช่นถ้าเราใช้เวลา=และ!ก็จะทำงานเป็นผู้ประกอบการเพียง แต่ถ้ามันอยู่ในรูปแบบของหรือ!= !==สามารถมีได้อยู่รวมกันจำนวนมากสำหรับตัวละครเหล่านี้เช่น !====, !==!ฯลฯ .. ฯลฯ .. รวมกันผู้ประกอบการควรจะอยู่ในรูปแบบที่ไม่ซ้ำกัน , การสั่งซื้อที่ไม่ซ้ำกัน , ชุดที่ไม่ซ้ำ (ตัวละครทุกตัวเคยชินรวมกับตัวละครอื่น ๆ ทั้งหมด) และแน่นอนไม่ต้องเว้นวรรคระหว่างพวกเขา

ตรวจสอบรายชื่อผู้ประกอบการด้านล่าง;

ป้อนคำอธิบายรูปภาพที่นี่


2
<table>ผมตกอยู่ภายใต้ภาพลวงตาเดียวกันของความสามารถในการใช้
ชาดแฮร์ริสัน

+ เกือบคิดว่าเป็นโต๊ะ ... แต่จริงภาพ
บาบา

38

==! ไม่ใช่ตัวดำเนินการ แต่มีสองอย่าง:

== และ !

! ที่มีความสำคัญสูงกว่า ==

ดังนั้น:

"a" !== " ": bool(true) -> ความจริงเพราะ "เป็น" มันไม่เท่ากับ ""

"a" ==! " ": bool(false) -> false เพราะ "a" ไม่เท่ากับ! ""

อาจจะเขียนด้วยช่องว่างระหว่าง == และ!


1
false because "a" is not equals to !" "! "" หมายถึงการโยนเพื่อบูลและคัดค้านเพื่อให้ "" เป็นจริงและ! "" เป็นเท็จ
Zaffy

@quarry ใช่ผมไม่ได้ไปมากเกินไปภายในคำอธิบาย: p
ไมเคิล Laffargue

29

==!ไม่ได้อยู่เช่นนี้ มันเป็นสัญกรณ์ที่ค่อนข้างลึกลับของ== !

ในฐานะที่เป็นช่องว่างที่ไม่ได้เรื่องในการดำเนินงานที่คุณสามารถได้อย่างง่ายดายเพียงเขียนa --> bซึ่งประเมินa-- > bแต่จะดูแปลก

ดังนั้นเป็นคำถาม: จะถูกแยกไป"a" ==! " " "a" == !" "การปฏิเสธของสตริงถูกปกคลุมด้วยหล่อความหมายใด ๆ แต่สตริง"0"และเป็นเมื่อหล่อ," "true

ดังนั้นการแสดงออก"a" == !" "จะได้รับการถ่ายโอน:

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

และเป็นstring "a"ไม่ได้เป็นเช่นเดียวกับนี้ประเมินการแสดงออกทั้งbool truefalse

ดังนั้นอะไรคือคุณธรรมของเรื่องราว อย่าปล่อยให้ตัวเองถูกสับสนโดยขาดหายไปหรือช่องว่างที่ไม่ถูกต้องวาง! :)


3
แตกต่างจากที่ระบุไว้ในคำตอบนี้ "a" == จริงประเมินเป็นจริงเพราะสตริงที่ไม่ว่างจะถูกโยนไปเป็นค่าบูลีนที่แท้จริง การแสดงออก "a" === จริงจะประเมินเป็นเท็จ
ปาสกาลขัดสน

25

==! ไม่ใช่ผู้ประกอบการ

==!ไม่ใช่ตัวดำเนินการเปรียบเทียบ php เลย - เหมือนกับ== !(สังเกตพื้นที่)

กล่าวคือ

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)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.