[英]If statement executes even when condition is false
if( (*ptr != ',') || strlen(ptr+1) < sizeof(struct A) * num1)
{
printf("\n Condition satisfied.");
}
這是有問題的代碼。 我有一個字符串,格式為str =“ -1,ABCDEFGH”,結構A的大小為15個字節。
我正在預先執行此操作:
number = strtoul(str, &ptr, 10);
完成此操作后,ptr指向“,”,數字= -1
查看IF條件,第一條語句的計算結果為false(因為* ptr =','),第二條語句的執行結果為TRUE,即使它應該為false(strlen(ptr + 1)為正,並且(sizeof( struct A)* number)為負,僅因為num1為負值)。
為什么此語句評估為真並進入IF塊? 我得到的輸出是“滿足條件”,而我不應該這樣。 提前致謝。
(sizeof(struct A) * number)
為負,僅因為num1
為負值
不完全的。 sizeof(struct A)
類型為size_t
(無符號類型)。
假如說
num
是int
類型, size_t
對應,等於或大於int
精度, sizeof(struct A) * num
是一個無符號值(因此非負),即使num
為負。
請參閱算術運算符 :
否則,如果無符號操作數的轉換等級大於或等於有符號操作數的轉換等級,則將有符號操作數轉換為無符號操作數的類型。
請注意,正如@ user3386109所評論的那樣, strlen
使用無符號類型。 因此, <
可能存在與*
相同的問題。
sizeof(struct A)是未定義的,並且還要乘以一個數字,因此它提供了一個
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.