即使条件为假,语句也会执行

时间:2015-09-12 02:07:40

标签: c if-statement sizeof strlen strtoull

if( (*ptr != ',') || strlen(ptr+1) < sizeof(struct A) * num1)
{
    printf("\n Condition satisfied.");
}

这是有问题的代码。我有一个格式为str =&#34; -1,ABCDEFGH&#34;的字符串,以及一个大小为15字节的结构A.

我事先执行此操作:

number = strtoul(str, &ptr, 10);

在此操作之后,ptr指向&#39;,&#39;和数字= -1

查看IF条件,第一个语句的计算结果为false(因为* ptr =&#39;,&#39;)并且第二个语句执行为TRUE,即使它应该为false(strlen(ptr +) 1)是正的,并且(sizeof(struct A)* number)是负的,因为num1是负值)。

为什么此语句评估为真并进入IF块?我得到输出条件满意&#39;而我不应该。提前谢谢。

2 个答案:

答案 0 :(得分:4)

  

(sizeof(struct A) * number)是否定的,只是因为num1是负值

不完全。 sizeof(struct A)的类型为size_t(无符号类型)。

假设

  • num的类型为int
  • size_t对应的签名类型的精度与int的精度相同或更大,

sizeof(struct A) * num是无符号值(因此非负数),即使num为负数。

请参阅Arithmetic operators

  

否则,如果无符号操作数的转换等级大于或等于带符号操作数的转换等级,则带符号操作数将转换为无符号操作数的类型。

请注意,在 @ user3386109 发表评论时,strlen也使用了无符号类型。因此<*可能会出现同样的问题。

答案 1 :(得分:-1)

sizeof(struct A)未定义,并且还乘以一个数字,因此它提供了