詭異的IF判斷式 |
答題得分者是:ddy
|
wildbattle
一般會員 發表:7 回覆:12 積分:3 註冊:2005-12-08 發送簡訊給我 |
大家好,小弟在寫程式的時候遇到一個很奇怪的問題,一直無法解決,同時也影響之後的程式進行。
在某個迴圈中有個if的判斷式如下: if((std_match2>=2.0)&&((max_match2*0.3)<=std_match2)) break; 其中std_match2及max_match2都只是double型態的資料而已。 將中斷點設在break;這行程式上做觀察,當程式運行到中斷點時,理論上if裡面的判斷內容應該是要為true。 但實際上該敘述卻是false。 而再比照其它的if判斷式,在其它地方的if都只有true才會進入。 這個問題困擾小弟很久了,程式也因此進行不下去,因為條件未滿足迴圈就因為break而停止。 因此下面的任何運算肯定都是錯的。 請問各位高手大大有沒有辦法解決這個問題?Q_Q |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
BCB6上沒遇到這個情況
但 中斷點設在break;上是一定不會停下來的 測試的範例: void __fastcall TForm1::Button1Click(TObject *Sender) { double std_match2=2.0, max_match2=2.0; for (int i=1; i!=10; i ) { if((std_match2>=2.0)&&((max_match2*0.3)<=std_match2)) break; Form1->Caption = "AAA"; //永遠不會被執行到 } } ===================引 用 wildbattle 文 章=================== 大家好,小弟在寫程式的時候遇到一個很奇怪的問題,一直無法解決,同時也影響之後的程式進行。 在某個迴圈中有個if的判斷式如下: if((std_match2>=2.0)&&((max_match2*0.3)<=std_match2)) break; 其中std_match2及max_match2都只是double型態的資料而已。 將中斷點設在break;這行程式上做觀察,當程式運行到中斷點時,理論上if裡面的判斷內容應該是要為true。 但實際上該敘述卻是false。 而再比照其它的if判斷式,在其它地方的if都只有true才會進入。 這個問題困擾小弟很久了,程式也因此進行不下去,因為條件未滿足迴圈就因為break而停止。 因此下面的任何運算肯定都是錯的。 請問各位高手大大有沒有辦法解決這個問題?Q_Q |
wildbattle
一般會員 發表:7 回覆:12 積分:3 註冊:2005-12-08 發送簡訊給我 |
感謝2樓的大大回覆。
我用的是BCB6,而且我把中斷點設在break;,程式確實會停下來耶...@@a 所以是我的BCB6有問題嗎?orz 我是設std_match2=0下去測的,而實際上我遇到問題時也是因為std_match2=0就進入break;。 可以請大大試試看把std_match2設為0再跑跑看嗎?
編輯記錄
wildbattle 重新編輯於 2009-08-02 01:01:23, 註解 無‧
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
double std_match2 = 0;
bool a, b; a = std_match2 >=2.0; b= (std_match2 *0.3)<=0; for (int i=1; i!=10;i ) { if( ( std_match2 >= 2.0) && ( ( std_match2 * 0.3)<=0 ) ) { break; } Form1->Caption = "hi"; } 你的bcb大概真的有問題 我這邊的break;仍然不會中斷 你也可以檢查一下a與b的布林值來驗證你的if判斷式。 ===================引 用 wildbattle 文 章=================== 感謝2樓的大大回覆。 我用的是BCB6,而且我把中斷點設在break;,程式確實會停下來耶...@@a 所以是我的BCB6有問題嗎?orz 我是設std_match2=0下去測的,而實際上我遇到問題時也是因為std_match2=0就進入break;。 可以請大大試試看把std_match2設為0再跑跑看嗎? |
wildbattle
一般會員 發表:7 回覆:12 積分:3 註冊:2005-12-08 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
一般遇到這種詭異的狀況,先不用慌把數值印出來,並簡化判斷流程
還有一種可能是編譯最佳化後引起的,如你所說加上一行無關緊要的程式,有可能改變最佳化後的流程 ===================引 用 wildbattle 文 章=================== 感謝大大的回覆,我找到我的問題了。 雖然很奇怪,但還是可以彌補的問題。 就是在break;之前加一行程式就可以了,我隨便加了一行無關緊要的程式。 結果if判斷是false就不再進入了,只有true才進入。 雖然這應該還是我的電腦有問題吧? ==a |
zhgwbzhd
一般會員 發表:10 回覆:32 積分:18 註冊:2008-07-24 發送簡訊給我 |
在判斷中最好不要使用復數。
不過我剛纔在bcb2007中測試了一下。 是沒問題的。 在bcb6中測試也沒問題。 代碼如下: double std_match2,max_match2; std_match2=3; max_match2=11; if((std_match2>=2.0)&&((max_match2*0.3)<=std_match2)) ShowMessage("T"); else ShowMessage("F"); |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
|
wildbattle
一般會員 發表:7 回覆:12 積分:3 註冊:2005-12-08 發送簡訊給我 |
我的詭異的if判斷是出現在if之後只有一行break;或continue的時候。
例如: if(std_match2>=0&&std_match2>=0.3*max_match2) break; 像這樣子。 如果改成: if(.....) { test=!test; //test是bool變數 break; } 這樣就正常了。 或者if下面接其它的單行敘述都沒問題。@@a 例如: if(....) A=A B C; 像這樣子都只有true才進入。 不過,最後有辦法彌補就好。感謝各位高手們的回覆。 ===================引 用 zhgwbzhd 文 章=================== 在判斷中最好不要使用復數。 不過我剛纔在bcb2007中測試了一下。 是沒問題的。 在bcb6中測試也沒問題。 代碼如下: double std_match2,max_match2; std_match2=3; max_match2=11; if((std_match2>=2.0)&&((max_match2*0.3)<=std_match2)) ShowMessage("T"); else ShowMessage("F"); |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |