ทำไมผู้ประกอบการระดับบิตมีลำดับความสำคัญต่ำกว่าการเปรียบเทียบ?


63

ใครบางคนสามารถอธิบายเหตุผลได้ทำไมในภาษายอดนิยม (ดูหมายเหตุด้านล่าง) ตัวดำเนินการเปรียบเทียบ (==,! =, <,>, <=,> =) มีลำดับความสำคัญสูงกว่าตัวดำเนินการระดับบิต (&, |, ^ , ~)?

ฉันไม่คิดว่าฉันเคยเจอการใช้งานที่สำคัญกว่านี้จะเป็นธรรมชาติ มันเป็นสิ่งที่ชอบเสมอ:

  if( (x & MASK) == CORRECT ) ...   // Chosen bits are in correct setting, rest unimportant

  if( (x ^ x_prev) == SET )      // only, and exactly SET bit changed

  if( (x & REQUIRED) < REQUIRED )   // Not all conditions satisfied

กรณีที่ฉันจะใช้:

  flags = ( x == 6 | 2 );     // set bit 0 when x is 6, bit 1 always.

อยู่ใกล้กับไม่มีอยู่

อะไรคือแรงจูงใจของนักออกแบบภาษาในการตัดสินใจเรื่องความสำคัญของผู้ปฏิบัติงาน


ตัวอย่างเช่นทั้งหมดยกเว้น SQL ที่ด้านบน 12 ภาษาเป็นเช่นนั้นในรายการภาษายอดนิยมของการเขียนโปรแกรมที่ langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic


16
ความผิดพลาดในการออกแบบดั้งเดิมกลับมาใน C
ratchet freak

7
@gnat ประเด็นของการร้องเรียนคืออะไร? OP ไม่ได้พูดคำว่า "ทั้งหมด" เพียงแค่ "ภาษายอดนิยม" และคนส่วนใหญ่ปฏิบัติตามคำสั่งนี้ ในตารางนี้มีเพียงหนึ่งใน 12 อันดับแรก (SQL) เท่านั้นที่ไม่ได้: langpop.com

3
@ dan1111 จุดคือโดยธรรมชาติเพื่อช่วยผู้ตอบให้เข้าใจคำถามที่ถามและให้คำตอบที่ดีกว่า คุณเห็นไหมว่านี่ไม่ใช่สถานที่สำหรับเกม Guessing - หรือตามที่หน้าทัวร์บอกว่า "มันไม่ใช่ฟอรัมการสนทนาไม่มีการพูดคุยกัน"
ริ้น

7
@gnat ฉันเห็นด้วยกับความกังวลของคุณเกี่ยวกับการคาดเดาเกม แต่ฉันไม่คิดว่ามันจะมีคุณสมบัติเมื่อเกือบทุกภาษายอดนิยมแสดงพฤติกรรมที่อธิบาย

5
@Dunk: โดยทั่วไปวิธีการ "โดยลางสังหรณ์" [arithmetics] [logic operator] [arithmetics]คือ โปรแกรมเมอร์ส่วนใหญ่ไม่ได้สร้างระเบียบวงเล็บเช่นif(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))- ส่วนใหญ่จะถือว่ามีความสำคัญของเลขคณิตมากกว่า logics และเขียนif( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() )) สมมติว่ามีความสำคัญของการดังกล่าวข้างต้น+ <ตอนนี้โดยสัญชาตญาณif( x ^ getMask() != PATTERN ) ควรทำตัวเหมือนกัน XOR เป็นตัวดำเนินการทางคณิตศาสตร์ ความจริงมันตีความว่าif( x ^ ( getMask() != PATTERN ) )มันเป็นเคาน์เตอร์ที่ใช้งานง่ายอย่างสมบูรณ์
เอสเอฟ

คำตอบ:


72

ภาษาได้คัดลอกมาจาก C และสำหรับ C Dennis Ritchie อธิบายว่าเริ่มแรกใน B (และบางที C ต้น) มีเพียงรูปแบบเดียว&ซึ่งขึ้นอยู่กับบริบทที่ทำ bitwise และหรือตรรกะหนึ่ง หลังจากนั้นแต่ละฟังก์ชั่นจะมีโอเปอเรเตอร์: &สำหรับบิตหนึ่งและ&&สำหรับตรรกะหนึ่ง จากนั้นเขาก็พูดต่อ

การแนะนำที่ล่าช้าของพวกเขาอธิบายความไม่ลงรอยกันของกฎสำคัญของ C ใน B one เขียน

if (a == b & c) ...

เพื่อตรวจสอบว่าaเท่ากับbและcไม่เป็นศูนย์; ดังกล่าวในการแสดงออกเงื่อนไขมันจะดีกว่าที่มีความสำคัญต่ำกว่า& ==ในการแปลงจาก B เป็น C เราต้องการแทนที่&ด้วย&&คำสั่งนั้น ที่จะทำให้การแปลงเจ็บปวดน้อยลงเราตัดสินใจที่จะให้ความสำคัญของ&ผู้ประกอบการที่ญาติเดียวกัน==และเพียงแบ่งลำดับความสำคัญของเล็กน้อยจาก&& &วันนี้ดูเหมือนว่ามันจะดีกว่าที่จะย้ายลำดับความสำคัญของ&และ==และทำให้ง่ายขึ้นสามัญสำนวน C: การทดสอบมูลค่าหลอกลวงกับค่าอื่นต้องเขียน

if ((a & mask) == b) ...

ในกรณีที่จำเป็นต้องใส่วงเล็บภายใน แต่ลืมได้ง่าย


1
จะไม่ล้มเหลวถ้าc=2หรือทำให้a==bเกิด~0และไม่1?
เอสเอฟ

ดูเหมือนจะเป็น == ขกลับ 0 หรือ 1 ดูcm.bell-labs.com/cm/cs/who/dmr/kbman.html
AProgrammer

ตรวจสอบการอ้างอิงในคำตอบและอ่านข้อความก่อนหน้า
SShaheen

1
@MasonWheeler: โดยเฉพาะอย่างยิ่งในระบบฝังตัวบางครั้งจำเป็นต้องใช้มาโครคล้ายฟังก์ชั่น [ในบางกรณีพวกเขาสามารถเสนอประสิทธิภาพที่ดีกว่าคำสั่งของขนาดได้ดีกว่าฟังก์ชั่นอินไลน์และในระบบฝังตัวที่สำคัญ การประกาศตัวแปรภายในมาโครนั้นเป็นไปไม่ได้ การใช้ตัวแปรโกลบอลภายในมาโครอาจใช้งานได้ แต่ดูเหมือนจะลำบาก
supercat

6
@ MasonWheeler: คุณสามารถหา Raspberry Pi หรือ Arduino สำหรับ $ 0.50 ในปริมาณ 1,000 ได้ไหม?
supercat

7

ตัวดำเนินการ Bitwise เกี่ยวข้องกับตัวดำเนินการเชิงตรรกะทั้งแนวความคิดและลักษณะที่ปรากฏซึ่งอาจอธิบายได้ว่าทำไมพวกเขาจึงอยู่ใกล้กันในตารางลำดับความสำคัญ บางทีหนึ่งอาจจะเถียงว่ามันจะสับสนสำหรับ&ที่จะสูงกว่า==แต่มีจะลดลงแล้ว&&==

เมื่อมีการตั้งค่าแบบอย่างก่อนหน้า (!) มันอาจจะดีกว่าสำหรับภาษาอื่น ๆ ที่จะติดตามมันเพื่อประโยชน์ของความมั่นคง

อย่างไรก็ตามฉันมักจะเห็นด้วยกับคุณว่านี่ไม่เหมาะสม ในการใช้งานจริงตัวดำเนินการบิตจะเหมือนกับตัวดำเนินการทางคณิตศาสตร์มากกว่าตัวตรรกะและมันจะดีกว่าถ้าพวกเขาถูกจัดกลุ่มกับตัวดำเนินการทางคณิตศาสตร์ที่สำคัญกว่า

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