【问题标题】:Is it possible to use integers as names for arrays?是否可以使用整数作为数组的名称?
【发布时间】:2016-12-28 21:38:54
【问题描述】:

我正在将游戏从 Sega Genesis 移植到 Sega Saturn,并且仅限于 C。我也在尽可能地关注游戏是如何在 Motorola 68000 汇编代码中编码的,这需要很多很多数组相同的结构。我说的是300或更多。为了组织和可读性,用数字而不是字符串来命名会更容易

例如,我会更喜欢

int 000[4] = {1, 2, 3, 4};
int 001[4] = {1, 2, 3, 4};

相对于:

int zerozerozero[4] = {1, 2, 3, 4};
int zerozeroone[4]  = {1, 2, 3, 4};

但除非数组名以字符开头,否则我的编译器不会编译。有没有办法做到这一点?我想我可以在数组的前面扔一个a,但如果可能的话我想避免这种情况。

【问题讨论】:

  • 多维数组就是这样做的。
  • 不使用结构/数组数组的原因是什么?
  • 首先,请查阅语言的语法。第二 - 你想完成什么?为什么用数字命名?
  • @Walter Tross 这是因为我正在为 Sega Saturn 开发。我正在将游戏从 Sega Genesis 移植到 Sega Saturn,并且我正在关注游戏在 68k asm 中的运行方式直至发球台。
  • 您的代码如何决定使用_300[] 数组与_099[] 数组?如果有基于数字的开关或if,那么指针数组或二维数组就是你所需要的。

标签: c arrays naming


【解决方案1】:

这是很奇怪的设计。

在人类意义上,数字真的不是名字。没有人阅读代码会理解名为_031 的数组的含义。

您应该弄清楚所有这些数组的共同点,并使用具有描述性名称的单个多维数组。

所以不是

int _001[4];
int _002[4];
...
int _300[4];

你应该有类似的东西

int whatever[300][4];

然后,无论您曾经访问过_002,您都只需访问whatever[1]。干净多了。如果您愿意,可以添加一个并将其设为 301 并使用基于 1 的索引。

【讨论】:

  • 我想我可以做到这一点。是否有任何形式的速度优势?还是只是为了组织?稍后,我将有一个 256 的数组,它指向编号数组的不同组合,我觉得输入 _025 而不是任何 [25] 会更容易。
  • 可能没有速度优势,但很可能也没有惩罚。而且它真的干净得多。任何时候你有很多相似的东西属于一起,你应该使用一个数组。对不起,我不明白你的例子。当然,如果您有一个索引到第一个的辅助数组,那么它同样适用于所有 300 个数组。
  • @Mr.Potatobadger 您可以只使用use an array named _,或任何简短但有效的名称。 [请注意,我不能 100% 确定 C 对以 _ 开头的文件范围标识符的规则,并且根据标准,该名称可能无效。]
【解决方案2】:

这是不可能的,不。

但是,您可以以任何有效字符(例如字母或下划线)开始变量名,然后输入其余数字。

例如,您可以使用int _001[4] 代替int 001[4]

对于刚刚阅读我的答案的人 - 大声疾呼以放松谁在下面回答了这对于人类阅读或可用性来说不是很好的设计。更多详情,请查看并点赞他的答案。

【讨论】:

  • 下划线很干净!肯定比在它前面拍一封信更喜欢,非常感谢你让我知道你可以做到这一点。
  • @Mr.Potatobadger 最好使用字母。与前导 _underscore 的任何保留使用一样干净且没有问题。
  • @Mr.Potatobadger 没问题!如果对您有帮助,请将答案标记为正确:)
  • 另外,你知道为什么stackoverflow不允许我编辑我的cmets吗?我在回复您时有 2 个错别字。
  • 编辑 cmets 与声望无关。每个人都可以编辑他们的 cmets 5 分钟,就这样。它们是一成不变的(当然,直到你删除它们!)
【解决方案3】:

没有,而且永远不会。

记住孩子们,标识符的正则表达式(C-wise)是[_a-zA-Z][0-9a-zA-Z]*,十进制数的正则表达式(C-wise)是[0-9]*!您的编译器实际上可以将 000 (等)视为十进制数,而是“错误地”将其视为表达式,这将造成巨大的编译器灾难!

编辑:为什么 C 不允许数字前缀标识符?

C 允许后缀有一个重要的概念。

例如,考虑这个伪代码: int 01234; int 01234l;

如果我们将标识符的正则表达式修改为[_0-9a-zA-Z]*,不仅会与十进制数的范围重叠,还可能会与lulf或@等特殊后缀的范围重叠987654329@也是。我们人类肯定可以阅读和分组这些东西,但计算机不能!计算机无法解决歧义,否则它将永远死亡!

【讨论】:

  • 后缀不是问题。例如,initial-0 使编译器查找八进制数:0123,它会拒绝0128。但是考虑一下非常简单的案例int 1 = 2; int x = 1;x 的值是多少?
猜你喜欢
  • 1970-01-01
  • 2017-03-24
  • 2021-07-24
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2022-10-25
相关资源
最近更新 更多