給陣列賦值的一些小坑

2021-08-16 01:46:44 字數 2057 閱讀 3824

陣列定義同時初始化是個常見的問題,比如,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語句最後一行資料都沒返回,...