討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
C語言BOOL判斷式問題
更改我的閱讀文章字型大小
作者 : qq01245(qq01245)
[ 貼文 13 | 人氣 1781 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/13 上午 09:50:20
不好意思,我學的比較淺,想請問說之前看書上說C語言不認識BOOL,但之前有看到其他程式C語言一樣可以做truefalse的敘述判斷。
這題題目是:輸入一整數,判斷是否為3和5的倍數或者5和7的倍數,可以的說能講解給我聽是最好嚕,另外在尋找熱心教學的大大們。

#include<stdio.h>
#include<stdlib.h>

int func(bool a,bool b)
{
  int i=0;
  if(i%3==0 && i%5==0)
  a=true;
  else
a=true;
  
  
  if(i%5==0 && i%7==0)
  b=true;
  else
b=false;
  
}


int main()
{
 int i,a,b;
 printf("Enter a number:");
 scanf("%d",&i);
 int p=func(a,b);
 
if(a)
    printf("%d 是3和5的倍數\n",i);
 else
    printf("%d 不是3和5的倍數\n",i);

if(b)
    printf("%d 是5和7的倍數\n",i);
 else
printf("%d 不是5和7的倍數\n",i);
    
 system("pause");
 return 0;


}
作者 : member001(member one)
[ 貼文 178 | 人氣 0 | 評價 1150 | 評價/貼文 6.46 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/14 上午 07:15:03
能通過編譯嗎?

用C++的編譯器是可以的,因為編譯器把它當成C++來處理。

但用C的編譯器是不可能通過編譯。C語言不懂bool, truefalse

此外,BOOL與bool是兩件事,C++明白bool,但不懂BOOL。
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人qq01245註記此篇回應為很有道理 2009/12/14 上午 09:43:53
>C語言一樣可以做truefalse的敘述判斷。


因為0是false 非0是true
所以雖然a和b是int
但是仍然可以用來判斷truefalse
作者 : qq01245(qq01245)
[ 貼文 13 | 人氣 1781 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/15 下午 10:48:49
所以!!只要改成用0或1判斷trun和flase就OK了?
還有C語言要除了0或1還有其他方法可以判斷嗎?
謝謝
作者 : qq01245(qq01245)
[ 貼文 13 | 人氣 1781 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/15 下午 10:49:00
所以!!只要改成用0或1判斷trun和flase就OK了?
還有C語言要除了0或1還有其他方法可以判斷嗎?
謝謝
作者 : qq01245(qq01245)
[ 貼文 13 | 人氣 1781 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/15 下午 10:50:42
打太快了!!抱歉
修正 true
修正 false
作者 : eaglewolf(狼鷹) Delphi優秀好手貼文超過200則
[ 貼文 311 | 人氣 1011 | 評價 2020 | 評價/貼文 6.5 | 送出評價 15 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/15 下午 11:26:12
請用非0視為 true (-1也應當視為true)
而不要用1來視為true
作者 : qq01245(qq01245)
[ 貼文 13 | 人氣 1781 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/15 下午 11:40:33
負值也會被判斷為true嚕!!
那不用1來判斷的原因是?

不好意思,對程式還是個謎的我比較想知道原因!!謝謝!!
作者 : tinylamb(識路的小羊)
[ 貼文 32 | 人氣 0 | 評價 60 | 評價/貼文 1.88 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人qq01245註記此篇回應為很有道理 2009/12/15 下午 11:43:52
這個func函數有三個不對的地方。
1.沒有返回值。這樣的話,在main函數里,if(a),if(b)就沒有發揮作用。
2.func函數每次只能返回一個值。也就是說不能同時返回a和b的值。
3.沒有將main函數里的i值傳入到func中。這樣的話,func中i值總是0。
>int func(bool a,bool b)
>{
> int i=0;
> if(i%3==0 && i%5==0)
> a=true;
> else
> a=true;
>
>
> if(i%5==0 && i%7==0)
> b=true;
> else
> b=false;
>
>}
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人qq01245註記此篇回應為最佳解答 2009/12/16 上午 02:19:29
>不好意思,我學的比較淺,想請問說之前看書上說C語言不認識BOOL,但之前有看到其他程式C語言一樣可以做truefalse的敘述判斷。

C 語言沒有 bool, true, 及 false 這幾個關鍵字, 它們是 C++ 語言的關鍵字. C99 新增了 _Bool 這個關鍵字, 它是一個類型. C99 同時也新添了 <stdbool.h> 這個頭檔, 裡面主要定義了 "bool", "true" 及 "false" 這幾個 macro 符號. bool 會展開成為 _Bool, 而 truefalse 則分別展開為 1 及 0.

雖然 C 語言沒有關鍵字 truefalse, 但 truefalse 的概念是有的. 任何式子的計算結果是 0 值, 則會判斷為 false, 反之則為 true.

所以如果你用 C 語言的編譯器, 你的程式是無法編譯的.

程式的主要問題 tinylamb 大大已經講了, 你程式的主要問題不是什麼值是 truefalse, 而是:
1. 欲判斷的數值沒有傳入函式裡.
2. 判斷的結果沒有傳回到 main() 裡.

要解決 (1), 最簡單的方法就是用參數:

  int func(int nValue) {...}

  int main()
  {
    int i;
    ...
    func(i)
    ...
  }

要解決 (2) 有幾個方法, 一是透過參數. 在 C 語言, 要把更改後的資料透過參數傳回到上一層, 必須用指標:
  void func(int nValue, int* pResult35, int *pResult57)
  {
    if ((nValue % 3 == 0) && (nValue % 5 == 0))
    {
      *pResult35 = 1;
    }
    else
    {
      *pResult35 = 0;
    }

    if ((nValue % 5 == 0) && (nValue % 7 == 0))
    {
      *pResult57 = 1;
    }
    else
    {
      *pResult57 = 0;
    }
  }

  int main()
  {
    int nValue, bResult35, bResult57;
    ...
    func(nValue, &bResult35, &bResult57);
    ...

    if (bResult35)
      ...
    else
      ...

    ...
  }

另一個方法是把結果透過函式的回傳類型傳回去. 但由於函式的回傳只能傳回一個物件, 所以這個方法在某些情況下不一定適合.

作者 : member001(member one)
[ 貼文 178 | 人氣 0 | 評價 1150 | 評價/貼文 6.46 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/16 上午 04:47:37
>>嗯
>>因為0是false 非0是true
>>所以雖然a和b是int
>>但是仍然可以用來判斷truefalse

請注意,無論是C還是C++,判斷與計算的truefalse是有差異的。

0是false,判斷時所有非0都是true,但計算結果的true卻是1。

舉例,假若int i的值是5,

if (i)
...

i非0,所以是真。

但 a=(i==5);

a計算出來的true是1。
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/16 上午 09:28:51
>所以!!只要改成用0或1判斷trun和flase就OK了?

嗯 你只要判斷是不是0就可以了 例如
if (x==0) {
    //false
} else {
    //true
}

>還有C語言要除了0或1還有其他方法可以判斷嗎?

不知耶 但這個方法就夠用了吧? 有什麼情況需要其它方法?

>a計算出來的true是1。

嗯 其實bool只要一個bit就夠了 0或1
所以轉成int時是1蠻正常的
作者 : qq01245(qq01245)
[ 貼文 13 | 人氣 1781 | 評價 0 | 評價/貼文 0 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/16 上午 09:57:37
TO sflam大大:
    剛剛試著把問題1和2,修正,結果是能正常判斷,謝謝指教。

TO tinylamb大大、 member001大大、kagaya大大:
    謝謝點出問題所在,最大的問題在於func。
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/16 下午 12:13:36
>雖然 C 語言沒有關鍵字 truefalse, 但 truefalse 的概念是有的.
>任何式子的計算結果是 0 值, 則會判斷為 false, 反之則為 true.
在這個概念下寫C程式,不應該是這樣(雖然實際上沒差):
if (x==0) {
    //false
} else {
    //true
}
而是
if (!x) {
    //false
} else {
    //true
}
或是
if (x) {
    //true
} else {
    //false
}

另外,在C裡面,邏輯運算結果,還是有false是0而true是1的。
(不是0和非o的結果)
例如:(5==5)的結果是1,所以
x=(5==5);//x的結果會是等於1


作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/16 下午 12:36:47
反過來說,C++有沒有0和非0的概念?
我"覺得"是有,例如:
bool i=(bool)6;//結果i值不是6 truncation的結果,而是1(true),因為6是非0。
Raymond 定義的書看得多,不知有沒有正式的官方說法。
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/16 下午 11:15:13
>>雖然 C 語言沒有關鍵字 truefalse, 但 truefalse 的概念是有的.
>>任何式子的計算結果是 0 值, 則會判斷為 false, 反之則為 true.
>在這個概念下寫C程式,不應該是這樣(雖然實際上沒差):
>if (x==0) {
〔.略.〕
>而是
>if (!x) {
〔.略.〕
>或是
>if (x) {
〔.略.〕

也許我沒說明清楚.

上面所說的 'true', 'false' 是是邏輯上的概念, 這裡主要指的是「比較運算子」(<, >, <=, >=, ==, !=) 中, 運算元之間的關係.

 C99 6.5.8 Relational operators
 6. Each of the operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) shall yield 1 if the specific relation is true and 0 if it is false. The result has type int.

 C99 6.5.9 Equality operators
 3. The == (equal to) and != (not equal to) operators are analogous to the relational operators except for their lower precedence. Each of the operators yields 1 if the specified relation is true and 0 if it is false. The result has type int. for any pair of operands, exactly one of the relations is true.

所以在 (x==0) 這個式子, 若 "x is equal to 0" 是 true, (x==0) 會得到 1.

'!' 也有說明:
 C99 6.5.3.3 Unary arithmetic operators
 5. The result of the logical negation operator ! is 0 if the value of its operand compares unequal to zero, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0 == E).


而 0 和 非-0 所指的是 if, if-else, while, do-while, for 等式子. 比方說 if
 C99 6.8.4.1 The if statement

   if ( expression ) statement
   if ( expression ) statement else statement

 2. In both forms, the first substatement is executed if the expression compares unequal to 0. In the else form, the second substatement is executed if the expression compares equal to 0.


所以 if ( expression ) 的意思相當於 if ( (expression) != 0 ). 當然這兩個是不完全相等的, (expression) 會得到一個數值, 而 (expression) != 0 會得到 0 或 1. 但從 if () 式子的角度來看, 在邏輯上並沒什麼不同.

〔續..〕
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/16 下午 11:15:36
〔..續〕

>反過來說,C++有沒有0和非0的概念?
>我'覺得'是有,例如:
>bool i=(bool)6;//結果i值不是6 truncation的結果,而是1(true),因為6是非0。
>Raymond 定義的書看得多,不知有沒有正式的官方說法。

由於 C++ 有 bool 類型, 所以比較運算子跟 C 語言有些不同:

 C++ 5.9 Relational operators
 1. The operands shall have arithmetic, enumeration or pointer type. The operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) all yield false or true. The type of the result is bool.

== 及 != 也是一樣.

至於 if, while 等式子, C++ 用的是 condition:

   if ( condition ) statement
   if ( condition ) statement else statement
   while ( condition ) statement

 C++ 6.4 Selection statement
 4. ... The value of a condition that is an expression is the value of the expression, implicitly converted to bool ...

至於
  bool i=(bool)6;

是屬於類型的轉換:

 C++ 4.12 Boolean conversions
 1. An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false any other value is converted to true.

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/17 上午 11:37:59
Raymond 可以寫編譯器了^^
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.203125