【问题标题】:Why char is not taken as numeral in C++?为什么 char 在 C++ 中不被视为数字?
【发布时间】:2020-07-28 09:46:24
【问题描述】:

我用 C 编写了一段代码,运行良好,我将它翻译成 C++。那里给出了错误的输出。我进行了一次迭代,其中我将输入和迭代器变量都用作 char 以节省空间。但表现不如预期。

unsigned char repeat, i;  
cin >> repeat;
for(i= 0; i < repeat; i++)

什么是等价线

scanf("%hhi", &repeat)

?

【问题讨论】:

  • scanf("hhi", &amp;repeat) -- 这到底是做什么的?这是对scanf 的奇怪调用。
  • 如果x'4',则x - '0'4。 (数字必须是连续的。)
  • @PaulMcKenzie 我猜 OP 的意思是 scanf("%hhi", &amp;repeat); 虽然 %hhi 匹配 signed char,而不是 unsigned char。 (scanf 的规范中可能存在缺陷,即 unsigned int 没有等效的 %i。)
  • @IanAbbott: "%hhu"
  • @rici "%hhu" 并不完全相同,因为它只允许十进制输入,而 %hhi 允许在输入中使用可选的十六进制或八进制前缀,例如-42-0x2a-052都可以用于输入值-42。

标签: c++ c char numbers int


【解决方案1】:

为什么 char 在 C++ 中不被视为数字?

因为 C 和 C++ 是不同的编程语言。

参见 n3337,一个 C++ 标准草案,实际上等同于 C++11 标准。对于C11 编程语言,请查看n1570CompCert 项目。

编程语言是一种规范,通常写在一些文档中。它的semantics 和它的syntax 一样重要。

如果您使用 GCC 的一些最新变体编译 C++ 源代码,我建议将 invoke 设置为 g++ -Wall -Wextra -g,以启用大量警告和一些调试信息。

考虑同时使用一些static program analysis 工具,例如Frama-CClang static analyzerCoverity 等等......

另请阅读How to debug small programs 和关于Undefined behavior

另请参阅 this site about C and C++ 并查看 RefPerSys(我积极参与的一些“有趣的”C++ free software 项目,AGI 相关)。

研究现有 C++ open source 项目的源代码,至少是为了获得灵感。 Qtfish shell 立即浮现在脑海中(但在 githubgitlab 或其他地方,例如 GhudiPPLFox toolkitFLTK 上还有成千上万的其他人)。通过积极为其中之一做出贡献,您将学到很多东西(甚至可能是RefPerSys

顺便说一句,我强烈建议显式地在 C 或 C++ 中初始化每个数字变量(所以代码 unsigned char repeat=0, i=0; 在你的情况下)。任何足够好的optimizing compiler 都会在它们无用时将它们删除,并且当它的行为变为更具确定性。

【讨论】:

  • 那我怎么用char来存储数字,说是为了优化。 1 == sizeof(char) &lt;= sizeof(short)我不需要持有超过100,那为什么要使用short?
  • 不要关心这样的微优化。把它们留给你的优化编译器。首先,编写一个或多或少正确运行的程序。然后花费可用的精力来分析和优化它。除非您的目标计算机是微控制器,例如 arduino 用于大容量,否则您的时间比您的计算机时间更有价值
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2019-09-19
  • 2018-03-07
  • 2012-06-14
相关资源
最近更新 更多