【问题标题】:C++ writing to myArray[0] and setting myInt = myFloat, why is this working?C++ 写入 myArray[0] 并设置 myInt = myFloat,为什么会这样?
【发布时间】:2021-08-01 16:11:26
【问题描述】:

我正在使用一个函数来适应一些 C++ 语法。 现在我想,我可能误解了:

我正在写入一个我定义为 myArray[0] 的静态 (?) 数组以进行实验。

所以它似乎不是静态的,但sizeof(myArray) 总是返回 0(?) 但我可以找到每个项目的内存地址(虽然我不知道如何以这种方式获取项目数量)。

还有一点我不明白,为什么我可以写myInt = myFloat

那么,什么是静态数组?我应该更好地将<vector> 用于未定义长度的数组吗?

(你可以在这里找到完整的代码int2bin main.cpp

#include <iostream>
//#include <regex>



int main()
{
  while(true) {
      //VARS
      unsigned int arrBin[0], intNum; //working, if set [0]! NOT static???
      unsigned int *pArr0 = &arrBin[0];
      unsigned int *pArr1 = &arrBin[1];
      std::cout << sizeof(arrBin) << '\n'; // 0 => sizeof() here items and not mem space?
      std::cout << pArr0 << '\n';// 0x7fff12de6c38
      std::cout << pArr1 << '\n';// 0x7fff12de6c3c
      int i; 
      float refNum;
     
      std::cout << "\n\nEnter a number to convert: "; 
      
      // GET INPUT
      std::cin >> refNum; // float
      intNum = refNum;    // get int of the dec for comparing. Why does this "int = float" work??? 

【问题讨论】:

  • 标准的doesn't permit 大小为零的数组,似乎&amp;arrBin[i] 并没有按照您的想法执行。
  • hmmm,但大小为零在该在线编辑器和 VSCode 中都可以使用。奇怪......(我只是设置它,看看会发生什么,我会在哪里找到数据)你是什么意思 re &arrBin[i]? @Evg
  • 有些编译器允许 ISO C++ 标准不允许的某些事情,这并不奇怪。这些称为特定于编译器的扩展。
  • C++ 有一个严格的类型系统。如果要将浮点数转换为整数,例如可以使用显式转换,例如 myInt = static_cast&lt;int&gt;(myFloat);。或者,您可以例如使用rounding functions 之一。其中一些将浮点数作为参数并返回整数,因此您无需执行强制转换。
  • 永远不要以“是否有效”来判断事物。有些动作(如越界写入或读取)是非法的,但很难或不可能检测到。相反,它们会导致未定义的行为,即任何事情都可能发生。您的程序可能会崩溃、抛出异常或似乎可以工作。

标签: c++ arrays casting static


【解决方案1】:
unsigned int arrBin[0]

数组变量的大小不能为0。程序格式错误。不要这样做。

unsigned int *pArr1 = &arrBin[1];

在这里,您使用超出数组边界的下标运算符(超出最后一个元素),因此程序的行为是未定义的。不要这样做。

(虽然我不知道如何以这种方式获取项目数)。

项目数为 0(或者如果一开始就允许的话)。

我不明白的另一件事是,为什么我可以写 myInt = myFloat?

你甚至没有声明这样的标识符。

【讨论】:

  • 当然,我不会在真正的代码中这样做;我只是“玩”一下以了解 thinks 在 C++ 中的工作原理。myInt = myFloat 并不表示 varName,但作为 daclaration 的类型不包含在此 sn-p 中。抱歉,如果我的问题具有误导性
【解决方案2】:

我正在写入一个我定义为 myArray[0] 的静态 (?) 数组以进行实验。

“静态”可能是指“固定大小”。 static 意味着完全不同的东西,请参阅 https://www.geeksforgeeks.org/static-keyword-cpp/

所以它似乎不是静态的

不是static,因此,它不是static也就不足为奇了。

但是 sizeof(myArray) 总是返回 0

它的大小为 0,因为指定了 0 的大小。虽然标准不支持这一点,但某些编译器可能允许这样做。

但我可以找到每个项目的内存地址(虽然我不知道如何以这种方式获取项目数量)。

&amp;arr[i] 产生地址。

我不明白的另一件事是,为什么我可以写 myInt = myFloat?

整数总是实数,但实数并不总是整数。那么,如何将 0.5 存储为整数?您可以投射它,也可以将它舍入。

那么,什么是静态数组?

在我为您提供的链接中,提到函数中的static 变量是在整个程序期间为其分配内存的变量。因此,static 数组是使用 static 关键字声明的数组,为程序的整个生命周期分配空间。您的函数中没有声明这样的数组。

我应该更好地使用未定义长度的数组吗?

这是固执己见。您可以使用pointer arithmetics 创建一个指针并导航到项目,实现与数组相同的行为,但长度不固定且语法略有不同。或者您可以使用库、vector 或任何适合您的任务和品味的东西。

【讨论】:

  • 感谢您的信息! (重新浮动/整数,我实际上需要两者都完全一样,只是想知道为什么它似乎在没有积极投射它们的情况下工作 - 但现在学会了永远不要进行隐式转换)感谢伟大的链接!
  • @BarbWire 欢迎您。只要将浮点数转换为整数,隐式转换是安全的,因为所有整数同时也是实数,因此将整数识别为实数应该没有问题。但是,反转,即从浮点到 int 可能会导致精度损失,并且积极确保行为是您想要的行为而不是编译器假定您想要的行为是一种很好的做法。但这仅适用于涉及精度损失或转换困难的情况。
猜你喜欢
  • 2014-12-30
  • 1970-01-01
  • 2010-10-01
  • 2012-07-29
  • 2020-02-18
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多