【问题标题】:If statement executes even when condition is false即使条件为假,if 语句也会执行
【发布时间】:2015-09-12 02:07:39
【问题描述】:
if( (*ptr != ',') || strlen(ptr+1) < sizeof(struct A) * num1)
{
    printf("\n Condition satisfied.");
}

这是有问题的代码。我有一个格式为 str = "-1,ABCDEFGH" 的字符串和一个大小为 15 字节的结构 A。

我正在预先执行此操作:

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

经过这个操作,ptr 指向 ',' 和 number = -1

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

为什么这个语句被评估为真并进入 IF 块?我得到了输出“条件满足”,而我不应该。提前致谢。

【问题讨论】:

  • 如果您知道第二个语句的评估不正确,为什么要向我们展示第一个?删除第一个,验证剩下的仍然会产生错误,然后给我们minimal complete example
  • strlensizeof 都使用无符号类型,而您还没有向我们展示num1 的类型。所以num1unsigned 在这种情况下-1 是一个非常大的正数,或者您忽略了有关“有符号与无符号比较”的编译器警告。
  • 我已经猜到你在sizeof(struct A) 上做错了什么。在结构上使用时,您唯一应该依赖 sizeof() 的时间是执行 memcpy() 操作。我的直觉告诉我,您可能正在错误地尝试进行字符串长度检查,并且不知道结构填充。 stackoverflow.com/questions/4306186/…

标签: c if-statement sizeof strlen strtoull


【解决方案1】:

(sizeof(struct A) * number) 是负数,因为num1 是负值

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

假设

  • num 的类型为 int
  • 有符号类型的精度,对应size_t等于或大于int的精度,

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

Arithmetic operators:

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

请注意,正如 @user3386109 所评论的,strlen 也使用无符号类型。所以&lt;* 可能存在同样的问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这个答案可能不完整。 @mohammed 考虑完成或删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多