คำถามติดแท็ก operator-precedence

ลำดับความสำคัญของตัวดำเนินการหมายถึงกฎที่ควบคุมลำดับที่ตัวดำเนินการได้รับการประเมินภายในนิพจน์หรือคำสั่งในภาษาโปรแกรม แตกต่างจาก [order-of -ecution] ซึ่งครอบคลุมการจัดลำดับเหตุการณ์การดำเนินการในระบบซอฟต์แวร์

14
ทำไมโครงสร้างเหล่านี้โดยใช้พฤติกรรมที่ไม่ได้กำหนดไว้ล่วงหน้าและหลังเพิ่มขึ้น?
#include <stdio.h> int main(void) { int i = 0; i = i++ + ++i; printf("%d\n", i); // 3 i = 1; i = (i++); printf("%d\n", i); // 2 Should be 1, no ? volatile int u = 0; u = u++ + ++u; printf("%d\n", u); // 1 u = 1; …

10
'AND' vs '&&' เป็นผู้ดำเนินการ
ฉันมี codebase ที่นักพัฒนาตัดสินใจที่จะใช้ANDและORแทนและ&&|| ฉันรู้ว่ามีความแตกต่างในความสำคัญของผู้ประกอบการ ( &&ไปก่อนand) แต่ด้วยกรอบงานที่กำหนด ( PrestaShopเพื่อความแม่นยำ) มันชัดเจนว่าไม่มีเหตุผล คุณใช้เวอร์ชั่นไหน คือandอ่านได้มากขึ้นกว่า&&? หรือไม่มีความแตกต่าง?

14
ทำไม x == (x = y) ไม่เหมือนกับ (x = y) == x
ลองพิจารณาตัวอย่างต่อไปนี้: class Quirky { public static void main(String[] args) { int x = 1; int y = 3; System.out.println(x == (x = y)); // false x = 1; // reset System.out.println((x = y) == x); // true } } ฉันไม่แน่ใจว่ามีรายการใน Java Language Specification ที่สั่งให้โหลดค่าก่อนหน้าของตัวแปรเพื่อเปรียบเทียบกับด้านขวา (x = y ) ซึ่งควรจะคำนวณตามลำดับโดยนัยโดยวงเล็บ ทำไมนิพจน์แรกถึงประเมินfalseแต่อันดับที่สองประเมินได้trueอย่างไร …

4
ความสำคัญของผู้ประกอบการลอจิก SQL: และและหรือ
ทั้งสองงบด้านล่างเทียบเท่ากันหรือไม่ SELECT [...] FROM [...] WHERE some_col in (1,2,3,4,5) AND some_other_expr และ SELECT [...] FROM [...] WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr มีตารางความจริงบางอย่างที่ฉันสามารถใช้ตรวจสอบสิ่งนี้ได้ไหม

1
เหตุใด (1 ใน [1,0] == จริง) จึงประเมินเป็นเท็จ
เมื่อฉันดูคำตอบสำหรับคำถามนี้ฉันพบว่าฉันไม่เข้าใจคำตอบของฉันเอง ฉันไม่เข้าใจจริงๆว่ามันถูกแยกวิเคราะห์อย่างไร เหตุใดตัวอย่างที่สองจึงส่งกลับค่าเท็จ >>> 1 in [1,0] # This is expected True >>> 1 in [1,0] == True # This is strange False >>> (1 in [1,0]) == True # This is what I wanted it to be True >>> 1 in ([1,0] == True) # But it's not just …

7
ตัวดำเนินการเชิงตรรกะที่ลัดวงจรได้รับคำสั่งหรือไม่? และลำดับการประเมินผล?
มาตรฐาน ANSI กำหนดให้ตัวดำเนินการเชิงตรรกะต้องทำการลัดวงจรใน C หรือ C ++ หรือไม่? ฉันสับสนเพราะฉันจำได้ว่าหนังสือ K&R บอกว่ารหัสของคุณไม่ควรขึ้นอยู่กับการดำเนินการเหล่านี้เพราะไฟฟ้าลัดวงจรเพราะอาจไม่ได้ ใครช่วยกรุณาชี้ให้เห็นว่าในมาตรฐานมันกล่าวว่าตรรกะ ops จะลัดวงจรเสมอ? ฉันสนใจ C ++ เป็นส่วนใหญ่คำตอบสำหรับ C ก็ยอดเยี่ยมเช่นกัน ฉันยังจำการอ่าน (จำไม่ได้ว่าอยู่ที่ไหน) ลำดับการประเมินนั้นไม่ได้ถูกกำหนดอย่างเข้มงวดดังนั้นโค้ดของคุณไม่ควรขึ้นอยู่กับหรือฟังก์ชั่นภายในนิพจน์จะถูกดำเนินการตามลำดับเฉพาะ: ในตอนท้ายของคำสั่ง จะได้รับการเรียก แต่คอมไพเลอร์มีอิสระในการเลือกคำสั่งที่มีประสิทธิภาพที่สุด มาตรฐานระบุลำดับการประเมินผลของนิพจน์นี้หรือไม่ if( functionA() && functionB() && functionC() ) cout<<"Hello world";

5
เหตุใดตัวดำเนินการด้านท้ายที่มีเครื่องหมายจุลภาคจึงประเมินเพียงนิพจน์เดียวในกรณีจริง
ฉันกำลังเรียนรู้ C ++ ด้วยหนังสือ C ++ Primer และหนึ่งในแบบฝึกหัดในหนังสือเล่มนี้คือ: อธิบายว่านิพจน์ต่อไปนี้ใช้ทำอะไร: someValue ? ++x, ++y : --x, --y เรารู้อะไรบ้าง? เราทราบดีว่าตัวดำเนินการ ternary มีลำดับความสำคัญสูงกว่าตัวดำเนินการลูกน้ำ ด้วยตัวดำเนินการไบนารีสิ่งนี้ค่อนข้างเข้าใจได้ง่าย แต่สำหรับตัวดำเนินการด้านท้ายฉันกำลังดิ้นรนเล็กน้อย ด้วยตัวดำเนินการไบนารี "มีลำดับความสำคัญสูงกว่า" หมายความว่าเราสามารถใช้วงเล็บรอบนิพจน์ที่มีลำดับความสำคัญสูงกว่าและจะไม่เปลี่ยนแปลงการดำเนินการ สำหรับตัวดำเนินการ ternary ฉันจะทำ: (someValue ? ++x, ++y : --x, --y) ทำให้เกิดรหัสเดียวกันอย่างมีประสิทธิภาพซึ่งไม่ได้ช่วยฉันในการทำความเข้าใจว่าคอมไพเลอร์จะจัดกลุ่มโค้ดอย่างไร อย่างไรก็ตามจากการทดสอบกับคอมไพเลอร์ C ++ ฉันรู้ว่านิพจน์นั้นรวบรวมและฉันไม่รู้ว่าตัว:ดำเนินการใดสามารถยืนได้ด้วยตัวเอง ดังนั้นคอมไพเลอร์ดูเหมือนจะตีความตัวดำเนินการ ternary อย่างถูกต้อง จากนั้นฉันดำเนินการโปรแกรมด้วยสองวิธี: #include <iostream> int main() { bool …

6
ทำไมใน Python จึง“ 0, 0 == (0, 0)” เท่ากับ“ (0, False)”
ใน Python (ฉันตรวจสอบด้วย Python 3.6 เท่านั้น แต่ฉันเชื่อว่ามันควรจะเก็บไว้สำหรับเวอร์ชันก่อนหน้านี้ด้วย): (0, 0) == 0, 0 # results in a two element tuple: (False, 0) 0, 0 == (0, 0) # results in a two element tuple: (0, False) (0, 0) == (0, 0) # results in a boolean True แต่: a = 0, …

7
ลำดับความสำคัญของตัวดำเนินการกับตัวดำเนินการ Javascript Ternary
ดูเหมือนว่าฉันจะพันหัวของฉันไปรอบ ๆ ส่วนแรกของรหัสนี้ (+ =) ร่วมกับตัวดำเนินการด้านท้ายไม่ได้ h.className += h.className ? ' error' : 'error' วิธีที่ฉันคิดว่ารหัสนี้ใช้งานได้มีดังต่อไปนี้: h.className = h.className + h.className ? ' error' : 'error' แต่นั่นไม่ถูกต้องเพราะนั่นทำให้เกิดข้อผิดพลาดในคอนโซลของฉัน ดังนั้นคำถามของฉันคือฉันจะเชื่อมต่อรหัสนี้อย่างถูกต้องได้อย่างไร?

7
บังคับใช้คำสั่งคำสั่งใน C ++
สมมติว่าฉันมีคำสั่งจำนวนหนึ่งที่ฉันต้องการดำเนินการตามลำดับคงที่ ฉันต้องการใช้ g ++ กับการเพิ่มประสิทธิภาพระดับ 2 ดังนั้นจึงสามารถจัดเรียงคำสั่งใหม่ได้ มีเครื่องมืออะไรบ้างในการบังคับใช้คำสั่งบางอย่าง ลองพิจารณาตัวอย่างต่อไปนี้ using Clock = std::chrono::high_resolution_clock; auto t1 = Clock::now(); // Statement 1 foo(); // Statement 2 auto t2 = Clock::now(); // Statement 3 auto elapsedTime = t2 - t1; ในตัวอย่างนี้เป็นสิ่งสำคัญที่จะต้องดำเนินการคำสั่ง 1-3 ตามลำดับที่กำหนด อย่างไรก็ตามคอมไพเลอร์ไม่สามารถคิดว่าคำสั่ง 2 เป็นอิสระจาก 1 และ 3 และรันโค้ดดังนี้ได้หรือไม่? using Clock=std::chrono::high_resolution_clock; foo(); …

4
ลำดับการดำเนินการ C ++ ในวิธีการผูกมัด
ผลลัพธ์ของโปรแกรมนี้: #include <iostream> class c1 { public: c1& meth1(int* ar) { std::cout << "method 1" << std::endl; *ar = 1; return *this; } void meth2(int ar) { std::cout << "method 2:"<< ar << std::endl; } }; int main() { c1 c; int nu = 0; c.meth1(&nu).meth2(nu); } คือ: method 1 …

3
ปัญหาการดำเนินการแปลก ๆ ใน SQL Server: -100 / -100 * 10 = 0
หากคุณดำเนินการผลที่ได้คือSELECT -100/-100*100 หากคุณดำเนินการผลที่ได้คือSELECT (-100/-100)*1010 หากคุณดำเนินการผลที่ได้คือSELECT -100/(-100*10)0 หากคุณดำเนินการผลที่ได้คือSELECT 100/100*1010 สถานะBOL : เมื่อตัวดำเนินการสองตัวในนิพจน์มีระดับความสำคัญของตัวดำเนินการเหมือนกันระบบจะประเมินจากซ้ายไปขวาตามตำแหน่งในนิพจน์ และ Level Operators 1 ~ (Bitwise NOT) 2 * (Multiplication), / (Division), % (Modulus) 3 + (Positive), - (Negative), + (Addition), + (Concatenation), - (Subtraction), & (Bitwise AND), ^ (Bitwise Exclusive OR), | (Bitwise OR) BOL ผิดหรือฉันพลาดอะไรไป? ดูเหมือนว่า-กำลังทำให้ความสำคัญ (ที่คาดหวัง) …

3
C ++ 17 มีการรับประกันลำดับการประเมินอะไรบ้าง
ผลกระทบของการโหวตใน การรับประกันลำดับการประเมิน C ++ 17 (P0145)ในรหัส C ++ ทั่วไป สิ่งต่อไปนี้มีการเปลี่ยนแปลงอย่างไร i = 1; f(i++, i) และ std::cout << f() << f() << f(); หรือ f(g(), h(), j());

2
รหัสจาก“ ภาษาโปรแกรม C ++” ฉบับที่ 4 ส่วน 36.3.6 มีลักษณะการทำงานที่กำหนดไว้อย่างชัดเจนหรือไม่
ใน Bjarne Stroustrup ของc ++ เขียนโปรแกรมภาษาส่วนฉบับที่ 4 36.3.6 STL เหมือนการดำเนินงานรหัสต่อไปนี้จะใช้เป็นตัวอย่างของการผูกมัด : void f2() { std::string s = "but I have heard it works even if you don't believe in it" ; s.replace(0, 4, "" ).replace( s.find( "even" ), 4, "only" ) .replace( s.find( " don't" ), 6, "" ); assert( …

1
ลำดับความสำคัญและการดำเนินการ bitmask
ฉันเจอเคสที่แปลกมาก (ดูเหมือน) ใช้หมายเลข 2 ( 0b10) และ bitmask ด้วย 1 ( 0b01) สิ่งนี้ควรสร้าง0b00ซึ่งเทียบเท่ากับ 0 อย่างไรก็ตามนี่คือสิ่งที่ Mr Schrödingerเข้ามา: var_dump(0b10 & 0b01); // int(0) var_dump(0b10 & 0b01 == 0); // int(0) var_dump(0b10 & 0b01 != 0); // int(0) เหล้าวิสกี้. แทงโก้. ฟ็อกซ์ทรอต ฉันยอมรับว่าไม่ใช่คนที่คมที่สุดเมื่อพูดถึงตัวดำเนินการระดับบิต - ดังนั้นฉันอาจจะผิดพลาดอย่างน่ากลัวตรงไหน อย่างไรก็ตามใน Python: 0b10 & 0b01 == 0 = …

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