【问题标题】:C++ mathematical comparison using function return value not working使用函数返回值的 C++ 数学比较不起作用
【发布时间】:2014-07-18 14:46:19
【问题描述】:

考虑以下代码:

   char foo[32] = "123456";
   printf("strlen(foo) = %d\n", strlen(foo));
   if ((5 - strlen(foo)) > 0)
   {
      //This statement prints because the comparison above returns true, why?
      printf("String must be less than 5 characters, test 1\n");
   }

   int tmp;
   if ((tmp = 5-strlen(foo)) > 0)
   {
      //This statement does not print and makes since
      printf("String must be less than 5 characters, test 2\n");
   }

正如 cmets 所指出的,我不明白为什么在与另一个值进行比较之前需要一个临时变量来存储数学计算的结果。

【问题讨论】:

  • 您的%d 应该是%zu

标签: c++ function math comparison return-value


【解决方案1】:

你得到true的原因是因为减法的结果是无符号。这又是因为size_tstrlen() 的返回类型)是无符号的,并且它足够大,以至于 int 被转换为它的类型,而不是相反。

当您将减法的结果分配给带符号的int 变量tmp 时,您会再次对结果进行签名,因此比较会按预期进行。

一般来说,如果您怀疑结果可能会变成负数,您应该非常小心地减去无符号值。如果您不是 100% 确定,请使用有符号类型,或首先避免减法。例如,上述条件的合法替代品是

if (strlen(foo) <= 5)
    ...

【讨论】:

  • "因为 size_t,strlen() 的返回类型,是无符号的" ...而且它足够大,int 被转换为它的类型而不是相反。
  • 但是为什么赋值会修改减法的结果类型呢?在分配给int类型之前不应该解决减法运算吗?
  • @Svalorzen,减法结果无符号,存入tmp时进行转换。
  • @Svalorzen,如果它不能满足第 4.7 节 [conv.integral] 的要求,则它是一个实现定义的值。
  • @Svalorzen 溢出的有符号算术未定义。允许转换(§4.7 [conv.integral]/p3“如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则该值不变;否则,该值是实现定义的.").
猜你喜欢
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
相关资源
最近更新 更多