c++布林型態的問題

2009-09-20 4:43 am
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

main()
{
bool b1,b2,b3;

cout << endl;
cout <<" Key in boolean data b1 : ";
scanf("%d",&b1);
cout << endl << endl;
printf(" 請輸入布林資料 b2 與 b3 : ");
cin>>b2>>b3;
cout<<endl<<endl<<" 您輸入的布林資料為 :\n\n\n";
printf(" b1 = %d , b2 = %x , b3 = %c\n\n\n",b1,b2,b3);
system("pause");
}


這是有關布林的一小段
執行結果是

Key in boolean data b1:1

請輸入布林資料b2與b3 :0 1

您輸入的布林資料為:

b1=1 , b2=0 , b3=(笑臉)

請按任意見繼續...



我想把其中的cin改成scanf()
變成

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

main()
{
bool b1,b2,b3;

cout << endl;
cout <<" Key in boolean data b1 : ";
scanf("%d",&b1);
cout << endl << endl;
printf(" 請輸入布林資料 b2 與 b3 : ");
scanf("%d%d",&b2,&b3);
cout<<endl<<endl<<" 您輸入的布林資料為 :\n\n\n";
printf(" b1 = %d , b2 = %x , b3 = %c\n\n\n",b1,b2,b3);
system("pause");
}


執行程式後
變成
Key in boolean data b1:1

請輸入布林資料b2與b3 :0 1

您輸入的布林資料為:

b1=0 , b2=0 , b3=(笑臉)


b1怎麼變成0 鍵入明明就打1..
更新1:

因為我才剛學 很多地方不懂~ 可以的話希望熱心的人能留下及時通讓我方便詢問...

更新2:

嗯... 嚴重錯誤?! 可以說明嗎= =?!

回答 (6)

2009-09-20 9:26 am
✔ 最佳答案
main()
{
bool b1,b2,b3;
cout << endl;
cout <<" Key in boolean data b1 : ";
//scanf("%d",&b1);
cin>>b1;
cout << endl << endl;
cout<<" 請輸入布林資料 b2 與 b3 : ";
//printf(" 請輸入布林資料 b2 與 b3 : ");
//scanf("%d%d",&b2,&b3);
cin>>b2>>b3;
cout<<endl<<endl<<" 您輸入的布林資料為 :\n\n\n";
cout<<"b1="<<b1<<" b2="<<b2<<" b3="<<b3;
//printf(" b1 = %d , b2 = %d , b3 = %d\n\n\n",b1,b2,b3);
system("pause");
}

2009-09-20 02:09:30 補充:
C++還夾雜著C的語法(printf(),printf()...)蠻奇怪的!
boolean型態大小1個Byte
scanf()的讀入格式只有%c,%d,%lf...我沒有看過有布林的格式
你用%d來讀入則會有1個int型態大小的資料被放入該變數的位址中
所以會影響到該boolean變數位址往後的一個int型態size內的值
假設你變數位址是0000F而一個int型態大小是4個Bytes
你輸入的值為1則%d會得到0001H值放入該變數記憶體位置
那麼0000F的位址會變成1H,0001F~0003F全部都會變成0H
在程式變數宣告中變數位址通常會是連續的空間所以很容易會出現錯誤!

2009-09-20 02:14:00 補充:
補充一下XXXX F 位址由右往左遞增1Byte(小到大)
所以最右邊的值位址最小最左邊則最大

2009-09-20 02:25:54 補充:
b3位址是最小會影響到後3個byte的內容
所以不管你怎麼輸入b2,b1一定都是0

->所以宣告時把順序改成bool b3,b2,b1;
則後面輸入不會影響前面宣告的boolean變數(答案才會正確)
看到這邊應該會發現這程式還是有嚴重的錯誤!
因為就算改了順序b3往後3個位址還是受到更動(萬一其他程式有用到怎辦?)

2009-09-20 02:35:00 補充:
想了想發現!
bool *b1,*b2,*b3;
就不會有問題了阿!
因為b1~b3是個boolean指標變數所以三個變數記憶體位址都會差4個byte
為何差4個byte呢?
因為指標變數代表這個變數的內容要用來放位址呀!
XP記憶體位址可以定址到3.5GB所以至少要有32bit(4 bytes)才能夠足夠定址整個記憶體
利用這個特性那b1~b3值都不會互相影響到!

2009-09-20 02:37:18 補充:
補充:scanf("%d",&b1);
表示以%d這個格式油標準輸入檔(stdin)讀入資料
寫入b1變數這個位址

2009-09-20 02:39:30 補充:
如果用C++的寫法
cin>>b1;
不會有這種問題!因為編譯器會以該變數的資料型態作為依據去讀入資料!

2009-09-20 02:42:03 補充:
以下是我修改過後的C寫法
main()
{
bool *b1,*b2,*b3;
printf(" Key in boolean data b1 : ");
scanf("%d",&b1);
printf(" 請輸入布林資料 b2 與 b3 : ");
scanf("%d %d",&b2,&b3);
printf(" b1 = %d , b2 = %d , b3 = %d\n",b1,b2,b3);
system("pause");
}

2009-09-20 02:45:16 補充:
printf(" b1 = %d , b2 = %x , b3 = %c\n\n\n",b1,b2,b3);
%d是以整數資料印出
%x是以16進制印出
%c是以字元印出
三者是有差別的!
前兩者用來印出boolean資料會正確!0或1怎印都對@@"

第三者就不一樣了0會印出空白1會印出笑臉耶!

2009-09-20 02:53:16 補充:
以下是我修改過後的C++寫法
main()
{
bool b1,b2,b3;
cout<<<" Key in boolean data b1 : ";
cin>>b1;
cout<<<" 請輸入布林資料 b2 與 b3 : ";
cin>>b2>>b3;
cout<<<" b1 = "<<<" b2 = "<


2009-09-20 03:07:38 補充:
用C寫好像沒用bool這個型態

但是用C++寫C才可以(Why? I don't know...)
2016-12-14 4:45 pm
Scanf Bool
2014-01-25 4:14 pm
如果你很確定自己很想結婚
婚友社的確是一個有效率的管道
年紀越大壓力越大
以前我去婚友社時
年輕的女生機會總是比較多
時間總是不站在女生這邊的
所以如果你想婚的念頭已經確定
就去找一家評價好一點的婚友社!
行動吧!
這是我之前參加的婚友社我覺得不錯

或搜尋"紅娘李姐"

不過還是建議你自己去諮詢過看是否適合你!
2009-09-20 7:20 am
我記得bool只有true跟false兩種,不是輸入用的@@
2009-09-20 5:58 am
這程式有嚴重的錯誤!不是沒有問題!

2009-09-20 04:41:49 補充:
簡單回應

0. C 沒有 bool

1. 嚴重錯誤,Circle 09-20 02:09:30 的補充第三列起,有說到,略

2. C 沒有 bool,〝應該〞不能用 (C++/C 混寫的) scanf 輸入!
 雖然有弊可做,但『強烈』不建議使用!
 在某些 compilers 裡會出問題!

3. endl 不是萬靈丹!它速度慢、程式大!
 非必要,不要用它!

= = = =

2009-09-20 04:43:39 補充:
C++ 用 printf 是上選!不是夾雜著C的語法,而且不奇怪!
cout 適用於 class!
而且,cout 不是 C++ 一開始就有的語法!!
如果用C++就不該用 printf,最開始的 C++就不能印出!

cout 速度比 printf 慢!
特別是自訂 operator << 裡輸出 primitive type 變數時,
蠻強烈建不要用 cout;要用 printf 的!


2009-09-20 02:42:03 補充的內容是錯的,請 Circle 修正一下


C沒bool,C 的祖父 Pascal 有!C 的兒子 C++ 把它加回去。
2009-09-20 5:02 am
程式沒問題,可能是執行時的輸入錯誤吧!

還有布林資料通常是用來判斷的,不是用來輸入的。


收錄日期: 2021-04-27 17:14:58
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20090919000016KK08807

檢視 Wayback Machine 備份