簡體   English   中英

如果條件為假,即使執行語句

[英]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 (無符號類型)。

假如說

  • numint類型,
  • 有符號類型的精度,與size_t對應,等於或大於int精度,

sizeof(struct A) * num是一個無符號值(因此非負),即使num為負。

請參閱算術運算符

否則,如果無符號操作數的轉換等級大於或等於有符號操作數的轉換等級,則將有符號操作數轉換為無符號操作數的類型。

請注意,正如@ user3386109所評論的那樣, strlen使用無符號類型。 因此, <可能存在與*相同的問題。

sizeof(struct A)是未定義的,並且還要乘以一個數字,因此它提供了一個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM