【问题标题】:C++ - What happens when you index an array by a float?C ++ - 当您通过浮点数索引数组时会发生什么?
【发布时间】:2015-09-21 15:47:02
【问题描述】:

我试图准确地了解在使用浮点值对数组进行索引时会发生什么。

此链接:Float Values as an index in an Array in C++

不回答我的问题,因为它指出浮点数应四舍五入为整数。然而,在我试图评估的代码中,这个答案没有意义,因为索引值只会是 0 或 1。

我正在尝试解决任天堂发布的编码挑战。为了解决这个问题,有一个古老的语句,它使用一个长而复杂的按位表达式对数组进行按位赋值。

数组被声明为指针

unsigned int* b = new unsigned int[size / 16]; // <- output tab

然后为每个元素分配 0

for (int i = 0; i < size / 16; i++) {   // Write size / 16 zeros to b
    b[i] = 0;
}

这是声明的开头。

b[(i + j) / 32] ^= // some crazy bitwise expression

上面的内容位于嵌套的 for 循环中。

我在这里节省了很多代码,因为我想尽可能多地自己解决这个问题。但我想知道是否存在您想要遍历这样的数组的情况。

除了自动转换为 int 的浮点数之外,它还必须有更多的功能。这里肯定有更多内容。

【问题讨论】:

  • 发生了一个numeric conversion,从浮点类型到整数类型。
  • 不是int / 16 仍然是int,而不是float
  • @JoachimPileborg 发生编译错误
  • @Jarod42 你不能在一个操作数不是整数或无范围枚举类型的情况下进行涉及下标的指针算术
  • 你会被炒鱿鱼,否则你可能会获得最低的不及格分数。

标签: c++ arrays indexing


【解决方案1】:

这里没有floats。 size 是整数,16 是整数,因此size/16 也是整数。

整数除法向零舍入,因此如果size[0,16) 中,则size/16 == 0。如果size[16,32) 中,那么size/16 == 1,以此类推。如果size(-16, 0] 中,那么size / 16 == 0 也是如此。

([x,y) 是从xy 的“半开”区间:也就是说,它包含xy 之间的每个数字,此外它还包括x 但不包括@ 987654340@)

【讨论】:

  • 谢谢,这很有意义。显然,我认为这个问题比实际问题更难,并且由于过度思考而错过了初学者的东西。
【解决方案2】:

回答标题中的问题:

#include <stdio.h>
int main(int argc, char** argv) {
  int x[5];

  int i;
  for (i = 0; i < 5; ++i)
    x[i] = i;


  x[2.5] = 10;

  for (i = 0; i < 5; ++i)
    printf("%d\n", x[i]);
}

如果我用gcc 编译它,我会得到一个编译器错误:

foo.c:10: error: array subscript is not an integer

【讨论】:

    【解决方案3】:

    就数组而言,下标运算符是语法糖。当你有以下情况时:

    class A {...}; 
    A ar[17]; 
    std::cout << ar[3] << std::endl;
    

    ar[3]与说:

    *(ar + 3); 
    

    所以ar[3.4]和说的一样

    *(ar + 3.4)    (1)
    

    从 C++ 标准第 5.7.1 节 - 加法运算符 我们读到:

    (...) 另外,两个操作数都应具有算术或无作用域枚举类型,或一个操作数应是指向完全定义对象类型的指针,而另一个应具有整数或无作用域枚举类型。

    这就是表达式 (1) 导致 compilation error 的原因。

    因此,当您通过浮点数索引数组时,会出现编译错误

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2016-06-14
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2012-10-08
      相关资源
      最近更新 更多