全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2274
推到 Plurk!
推到 Facebook!

詭異的IF判斷式

答題得分者是:ddy
wildbattle
一般會員


發表:7
回覆:12
積分:3
註冊:2005-12-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-01 14:31:33 IP:118.169.xxx.xxx 訂閱
大家好,小弟在寫程式的時候遇到一個很奇怪的問題,一直無法解決,同時也影響之後的程式進行。
在某個迴圈中有個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
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-01 14:41:44 IP:203.75.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-02 00:52:20 IP:118.169.xxx.xxx 訂閱
感謝2樓的大大回覆。
我用的是BCB6,而且我把中斷點設在break;,程式確實會停下來耶...@@a
所以是我的BCB6有問題嗎?orz

我是設std_match2=0下去測的,而實際上我遇到問題時也是因為std_match2=0就進入break;。
可以請大大試試看把std_match2設為0再跑跑看嗎?
編輯記錄
wildbattle 重新編輯於 2009-08-02 01:01:23, 註解 無‧
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-02 09:26:09 IP:118.167.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-08-02 22:16:44 IP:118.169.xxx.xxx 訂閱
感謝大大的回覆,我找到我的問題了。
雖然很奇怪,但還是可以彌補的問題。
就是在break;之前加一行程式就可以了,我隨便加了一行無關緊要的程式。
結果if判斷是false就不再進入了,只有true才進入。

雖然這應該還是我的電腦有問題吧? ==a
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-03 10:28:02 IP:122.147.xxx.xxx 訂閱
一般遇到這種詭異的狀況,先不用慌把數值印出來,並簡化判斷流程
還有一種可能是編譯最佳化後引起的,如你所說加上一行無關緊要的程式,有可能改變最佳化後的流程



===================引 用 wildbattle 文 章===================
感謝大大的回覆,我找到我的問題了。
雖然很奇怪,但還是可以彌補的問題。
就是在break;之前加一行程式就可以了,我隨便加了一行無關緊要的程式。
結果if判斷是false就不再進入了,只有true才進入。

雖然這應該還是我的電腦有問題吧? ==a
zhgwbzhd
一般會員


發表:10
回覆:32
積分:18
註冊:2008-07-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-03 10:43:45 IP:221.218.xxx.xxx 未訂閱
在判斷中最好不要使用復數。

不過我剛纔在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");

編輯記錄
zhgwbzhd 重新編輯於 2009-08-03 10:48:49, 註解 無‧
zhgwbzhd 重新編輯於 2009-08-03 10:51:33, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-04 17:39:09 IP:122.116.xxx.xxx 未訂閱
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-08-04 18:34:27, 註解 無‧
wildbattle
一般會員


發表:7
回覆:12
積分:3
註冊:2005-12-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-08-18 11:01:05 IP:118.169.xxx.xxx 訂閱
我的詭異的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");

系統時間:2017-10-23 23:09:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!