標籤:

關於bool類型的c++條件判斷問題?

#include &
#include &
int main() {//在字元串str1中刪除字元串str2中出現的字元。
char str1[10010], str2[10010];
int hashtable[128];
int len1, len2;
gets(str1);
gets(str2);
memset(hashtable, 1, sizeof(hashtable));
len1 = strlen(str1);
len2 = strlen(str2);
for (int i = 0; i &< len2; ++i) { char c = str2[i]; hashtable[c] = 0; } for (int i = 0; i &< len1; ++i) { char c = str1[i]; if (hashtable[c]) printf("%c", c);//寫成if (hashtable[c] == 1)為什麼不對? } return 0; }


因為memset裡面的1是位元組,一個int有4個位元組,每一個位元組就都變成了1。那麼設置完了之後,那個int的值應該是16843009。16843009==1當然是false。


關鍵在於 memset(hashtable, 1, sizeof(hashtable)); 這句是讓 hashtable 所指向的內存區域每個 byte 全都變成 0x01
而 hashtable 是 int* 所以一次會讀取 4 個位元組。

hashtable[c] 的值會初始化為 0x01&<&<24 + 0x01&<&<16 + 0x01&<&<8 + 0x01 = 0x01010101 = 16843009

自然 16843009 == 1 為 false


因為memset是按位元組的,而一個int是4個位元組(假設不是16位環境)


除非你對memset做了什麼很有把握,否則不要用memset。

memset是按位元組填充的。

memset是按位元組填充的。

memset是按位元組填充的。

什麼意思呢?

你現在這樣memset過去,每個元素不是你想要的1,

而是:0x01010101

這時候,你需要fill:

#include &
std::fill(hashtable,hashtable+(sizeof(hashtable)/sizeof(int)),1);

//偷懶就直接
std::fill(hashtable,hashtable+128,1);


即使可以 也應該寫成 != 0 而不是==1


題主理解了原因後,我給題主提供一個解決方案:

memset的時候,全部設置為0或者-1,只有這兩個數可以保證最後結果不出錯。原因是-1的補碼寫作二進位就是全為1,所以即使按位元組填充也不會出現問題。

把所有的1改成-1就可以了。


推薦閱讀:

extern C裡面能有C++代碼嗎?
請問我該注重學習Linux哪個方面?
為什麼使用virtual關鍵字在C++與C#會出現不同的效果?求解答。
如何有效的練習並且提升寫代碼的能力?
關於 C++ 浮點數計算誤差問題?

TAG:編程 | CC |