2013-09-27 9 views
11

मैं बिटवाइव नंबर तुलना चलाने की कोशिश कर रहा हूं और मेरा कोड "if" कथन के साथ मेरे कोड के लाइन 30 पर अभिव्यक्ति की अवैध शुरुआत के साथ आ रहा है।अभिव्यक्ति जावा बुलीयन की अवैध शुरुआत?

मेरे कोड पढ़ता है के रूप में इतना:

public class Project7 { 

    public static void main(String[] args) { 
     Scanner keyboard = new Scanner(System.in); 
     double P = keyboard.nextDouble(); 
     double Q = keyboard.nextDouble(); 
     double R = keyboard.nextDouble(); 
     double S = keyboard.nextDouble(); 
     boolean First_Relation; 
     boolean Second_Relation; 

     if (P > Q) First_Relation = true; 
     if (R < S) Second_Relation = true; 

     if (First_Relation = true) & (Second_Relation = true); 
     System.out.println("Given the values for p,q,r, and s the expression " 
     + "(p > q) && !(r < s) evaluates to "); 
    } 
} 
+0

'First_Relation = TRUE' होना चाहिए' First_Relation == में ' – Ashok

+16

if' क्यों लोगों को सवाल मतदान कर रहे हैं TRUE'? यह मुद्दा स्पष्ट रूप से बताता है क्योंकि पूछताछ करने में सक्षम है, और प्रयास का प्रदर्शन करता है। उन्नत प्रश्नों या लक्ष्य उन्नत कोडर के बारे में हर सवाल नहीं होना चाहिए। – shovavnik

+0

आपका मतलब है, तीसरा अगर कथन? – Raedwald

उत्तर

104

एक if बयान फार्म की है:

if (condition) statement 

आप वर्तमान में दो कोष्ठकों के भीतर की स्थिति मिल गया है ... जो भी अंत मान असाइन करना, जो शायद आप नहीं चाहते हैं।

if ((First_Relation = true) & (Second_Relation = true)) 

तो समानता जांच के असाइनमेंट परिवर्तित, के रूप में अन्यथा यह बस दोनों चर के true प्रदान करेंगे और स्थिति उनके पिछले मान की परवाह किए बिना पारित करेंगे:

तो सबसे पहले ठीक यह संकलित करने के लिए प्राप्त करने के लिए

if ((First_Relation == true) & (Second_Relation == true)) 

फिर बूलियन स्थिरांक के साथ तुलना निकालें:

if ((First_Relation) & (Second_Relation)) 

तब हटाने अनावश्यक कोष्ठक:

if (First_Relation & Second_Relation) 

तब चर जावा नामकरण रिवाजों का पालन करते हैं:

if (firstRelation & secondRelation) 

तब के और अधिक परंपरागत && बजाय & का उपयोग करें - && शॉर्ट सर्किट है, और लगभग हमेशा है आप क्या चाहते हैं:

if (firstRelation && secondRelation) 

अब भी आपको अर्ध-कॉलन डायर मिला है आपकी if स्थिति के बाद ectly, जो इसे व्यर्थ बनाता है - यह हमेशाSystem.out.println कथन निष्पादित करेगा, क्योंकि यह if कथन का हिस्सा नहीं है। आप सिर्फ सेमी-कोलन को दूर कर सकता है, लेकिन मैं स्पष्टता के लिए ब्रेसिज़ जोड़ेंगे:

if (firstRelation && secondRelation) { 
    System.out.println("insert text here"); 
} 

इसके बाद, ध्यान दें कि आप वास्तव में अपने चर आरंभ कर रहे हैं तो हालत सच है - तो आप वर्तमान में हूँ चर को पढ़ने की कोशिश करने के लिए एक संकलन-समय त्रुटि प्राप्त करें जो निश्चित रूप से असाइन नहीं की गई हैं।

सबसे पहले, निश्चित काम को ठीक:

// Names changed to follow conventions 
boolean firstRelation = p > q; 
boolean secondRelation = r < s; 

... और इसके बाद के संस्करण कोड ठीक होना चाहिए।

अगला, यह बताएं कि आप वास्तव में उन अतिरिक्त चर से बहुत कम प्राप्त कर रहे हैं।बजाय स्थिति इनलाइन:

if (p > q && r < s) { 
    System.out.println("Given the values for p,q,r, and s the expression " 
    + "(p > q) && !(r < s) evaluates to "; 
} 

इस बिंदु पर, यह बहुत स्पष्ट हो जाता है वहाँ एक और बग है कि - क्योंकि आपके संदेश के बारे में बात करती है !(r < s) लेकिन हालत अभी r < s है। तो आपको यह तय करने की ज़रूरत है कि आप क्या हासिल करना चाहते हैं, और कोड और संदेश एक ही चीज़ को प्रतिबिंबित करते हैं। ध्यान दें कि आप संदेश को पूरा नहीं करते हैं, या तो। दरअसल, आप पूरी चीज को सरल बना सकते हैं:

System.out.println("Given the values for p,q,r, and s the expression " 
    + "(p > q) && !(r < s) evaluates to " + ((p > q) && !(r < s)); 

... या जो भी आप वास्तव में अभिव्यक्ति चाहते हैं।

+0

+1 – ivarni

+0

अच्छा जवाब! मैं दोनों संबंध अभिव्यक्तियों को भी रेखांकित करता हूं क्योंकि वे पठनीयता को बढ़ाते हैं: यदि (पी> क्यू एंड आर आर <एस) ... – isnot2bad

+1

@ isnot2bad: सच है, इसका उल्लेख होगा। –

2
if (First_Relation == true && Second_Relation == true) 
{ 
    System.out.println("Given the values for p,q,r, and s the expression " 
    + "(p > q) && !(r < s) evaluates to "); 
} 

और प्रभावी तरीका

if (First_Relation && Second_Relation) 
    { 
     System.out.println("Given the values for p,q,r, and s the expression " 
     + "(p > q) && !(r < s) evaluates to "); 
    } 
+0

पहला स्निपेट अभी भी संकलित नहीं होगा, और आपने वास्तव में मतभेदों को समझाया नहीं है। –

+0

मेरे अपडेट किए गए उत्तर पर विचार करें – Ashok

+0

ठीक है कि अब संकलित है, लेकिन आपने इस बारे में कुछ भी नहीं बताया है कि आपने '&' '' '' '' '' '' '' और '=' ''== 'क्यों बदल दिया है। –

1

कोशिश

(First_Relation = true) & (Second_Relation = true) 

लेने के लिए कोष्ठक में है। और ";" को हटा दें "अगर" कथन के अंत से, इसका कोई मतलब नहीं है: ";" को एक नया स्टेटमेंट समाप्ति (आपके मामले में खाली बयान) के रूप में माना जाता है और जैसा कि आपने "if" कथन के दायरे को प्रदान नहीं किया है - यह केवल अगले राज्य के लिए काम करता है यानी खाली कथन।

4

जहाँ तक मुझे पता है, आप जावा में & ऑपरेटर का उपयोग नहीं कर सकते युगल जो बिटवाइज़ तुलना करने के लिए। इसका उपयोग केवल अन्य सरल प्राइमेटिव्स जैसे कि इनट्स और चार्स के साथ किया जा सकता है।

इसके अलावा, जिस तरह से आप & ऑपरेटर का उपयोग कर रहे हैं क्योंकि आप इसे उपयोग कर रहे हैं P>Q और R<S, जो दोनों के बूलियन मूल्यों उत्पादन के परिणामों की तुलना करने संख्याओं के बीच एक बिटवाइज़ तुलना नहीं करेगा।

युगल के बीच थोड़ी सी तुलना करने के लिए, आपको पी के साथ क्यू और आर के साथ पी की तुलना करने के लिए एक अलग तकनीक का उपयोग करने की आवश्यकता है। यह करने के लिए यहां एक तरीका है: https://stackoverflow.com/a/13928322/213343

+0

वह युगल के बीच बिटवाई तुलना करने की कोशिश कर रहा है? – matehat

+0

कोड में नहीं।उनका सवाल इस बात से शुरू होता है: "मैं बिटवाइव नंबर तुलना चलाने की कोशिश कर रहा हूं ..."। मेरा जवाब बताता है कि उसका कोड उस लक्ष्य को पूरा क्यों नहीं कर रहा है। इसके अलावा, यह ऑपरेटर के गलत उपयोग के साथ फिट बैठता है, जो * bitwise और ऑपरेटर है *। – shovavnik

1

यदि स्थिति पूरी नहीं हुई है तो कोई संदेश नहीं है। इसलिए मैं सुझाव है:

boolean evaluation = (P > Q) && !(R < S); 
System.out.println("Given the values for p,q,r, and s the expression " 
    + "(p > q) && !(r < s) evaluates to " + evaluation); 
संबंधित मुद्दे