陣列定義同時初始化是個常見的問題,比如,int a[3]=,其中a[0],a[1],a[2]這三個值都為0。
如果這樣定義,同時賦值:int a[3]=,是不是意味著a[0]=1,a[1]=1,a[2]=1呢?這是乙個很容易出錯的問題,答案肯定不是這樣,筆者在多個編譯器上試過,結果只有a[0]=1,而a[1]=0,a[2]=0。
如果要追究原因,只能去問搞編譯器的人。語言有時候很難說為什麼這樣,或許只能方便而已。這是vc6.0下的彙編:
4: int a[3]=;
00401028 mov dword ptr [ebp-0ch],0 ;
a[0]=0
0040102f xor eax,eax ;暫存器
eax清零
,eax
的值為0
00401031 mov dword ptr [ebp-8],eax ;把
eax的值賦給
a[1],
所以a[1]=0
00401034 mov dword ptr [ebp-4],eax;把
eax的值賦給
a[2],
所以a[1]=0
5: int b[3]=;
00401037 mov dword ptr [ebp-18h],1;
b[0]=1
0040103e xor ecx,ecx;暫存器
ecx清零
, ecx
的值為0
00401040 mov dword ptr [ebp-14h],ecx;把
ecx的值賦給
b[1],
所以b[1]=0
00401043 mov dword ptr [ebp-10h],ecx;把
ecx的值賦給
b[2],
所以b[1]=0
對於整數型陣列,若要是初始化為非0的值時應該使用for迴圈
而對於字元型 或 0 應該使用memset 函式
如下是可以的,能把陣列中的元素值都設定成字元1,
[cpp]view plain
copy
#include
#include
using
namespace
std;
intmain()
而,如下程式想吧陣列中的元素值設定成1,卻是不可行的
[cpp]view plain
copy
#include
#include
using
namespace
std;
intmain()
問題是:
1,第乙個程式為什麼可以,而第二個不行,
2,不想要用for,或是while迴圈來初始化inta[5];能做到嗎?(有沒有乙個像memset()這樣的函式初始化)
答:1.因為第乙個程式的陣列a是字元型的,字元型佔據記憶體大小是1byte,而memset函式也是以位元組為單位進行賦值的,所以你輸出沒有問題。而第二個程式a是整型的,使用memset還是按位元組賦值,這樣賦值完以後,每個陣列元素的值實際上是0x01010101即十進位制的16843009。你看看你輸出結果是否這樣?
2.如果用memset(a,1,20);
就是對a指向的記憶體的20個位元組進行賦值,每個都用ascii為1的字元去填充,轉為二進位制後,1就是00000001,佔乙個位元組。乙個int元素是4位元組,合一起就是1000000010000000100000001,就等於16843009,就完成了對乙個int元素的賦值了。
如何給陣列a初始化為無窮大?
利用上面原理,memset( a, 0x3f,sizeof( a) ),0x3f 轉換成十進位制為63,每個位元組都用ascii碼為63的字元去填充,轉換成為禁止就是00111111,佔乙個位元組,int型4個位元組就是 0011111100111111
00111111
00111111,約等於無窮大
python中的一些小坑
a 1 b 1 這兩個看起來好像也沒什麼差別嘛,就是乙個都好而已 列印出來的結果卻差很多!print type a print a print type b print b 1 1,a 1 2,3 b a a 4,5,6 a a 4,5,6 print a,b 使用 列印結果 1,2,3,4,5,6...
陣列的一些小知識
陣列 陣列就是一種容器,儲存一組型別相同的資料。陣列可以儲存基本資料型別與引用資料型別。陣列初始化格式格式 動態初始化 1 一步完成 資料型別 變數名稱 new 資料型別 長度 2 分步完成 資料型別 變數名稱 null 變數名稱 new 資料型別 長度 靜態初始化 1 資料型別 變數名稱 new ...
SQL select賦值的一些坑
之前做專案的時候,發現使用select給變數賦值但如果查詢的結果沒有返回時,並不會為變數賦值,而是使用原本的值,導致出錯 上網查詢了下資料,記錄下以免再犯錯 在使用select語句為sql變數賦值的時候,一定要清楚變數的值是取決於select語句的查詢結果,如果select語句最後一行資料都沒返回,...