为什么我必须做c-48? \a 和 %2.f 是什么意思?

Why I have to do c-48? and what does \a and %2.f mean?

这个程序是一个简单的计算器。 起初抱歉我的英语不好,我想知道 '\a' & '%2.f' 是什么意思 我知道 %f 是 double 但为什么是 '2.'在 'f' 前面? 在结束之前我们将 'dgt' 设置为 'c-48' 我想知道为什么 '-48' 我是信息学的初学者,你有什么特别的提示吗?

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
   printf("Simple Calculator: \nValid inputs are +-*/=and digits 0,...,9\n");
   printf("Your input: \n");
   double r = 0.0;
   double dgt = 0.0;
   char lst_opt = '+';
   const int nxt_dgt = 1;
   const int nxt_opt = 2;
   int nxt_npt = nxt_dgt;
   while (1)
   {
       char c = _getch();
       switch (c)
       {
        case '+': 
        case '-':
        case '*':
        case '/':
            if (nxt_npt != nxt_opt)
            {
                printf("\a");
                break;
            }
            printf("%c", c);
            lst_opt = c;
            nxt_npt = nxt_dgt;
            break;
        case '=': 
            if (nxt_npt != nxt_opt)
            {
               printf("\a");
               break;
            }
               printf("\n=%.2f", r); //double, but why .2?
               nxt_npt = nxt_opt;
               break;
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            if (nxt_npt != nxt_dgt)
            {
               printf("\a");
               break;
            }
            printf("%c", c);
            dgt = c-48;
            switch (lst_opt)
            {
              case '+': r += dgt; break;
              case '-': r -= dgt; break;
              case '*': r *= dgt; break;
              case '/': r /= dgt; break;
            }
            nxt_npt = nxt_opt;
            break;
            }
      }
_getch();
}

\a是用来发出声音的 c-48 :如注释中所述,48 是字符“0”的 ascii 值。所以 c-48 将 ascii 字符‘0’..‘9’转换为整数值 0 ... 9 在打印的文档中,您可以看到 %2.f 表示您打印的浮点值在小数点左侧至少有 2 个字符且没有小数点,例如: 2.643 -> ‘2’ 123.4 -> ‘123’

  • \a 是什么意思?

\n一样,一个转义字符,意思是“换行”,它也是一个转义字符,意思是“警告”,在“打印”时发出哔声。 您可以找到信息(包括其他特殊转义字符)Here

  • 为什么是负 48?

在代码中,它试图从一个字符中获取一个整数。它没有做 if(c == '3') i = 3; 之类的事情,而是使用字符 '0'~'9' 在 ACSII Table 中的排序方式。可以看到,'0'~'9'从48到57是紧排的,即'0' - 48的结果为0,其他的也一样。

  • %2.f

你知道 %f 用于打印 float 变量,这很好,但还有更多需要了解。您可以格式化变量的打印方式。 2. 代表“打印浮点数至少 2 个字符宽,也 none 应打印小数位。更多 printf() 格式信息 Here

whats the meaning of '\a'

这个其实有点晦涩难懂。出现在字符常量或字符串文字中的转义序列 \a 表示一个字符,当传送到终端时,会导致发出警报信号和/或显示警报信号而不改变输出位置。信号的详细信息因环境而异,但它可能会发出哔哔声或导致屏幕闪烁或类似情况。这几天很少使用。

& '%2.f' I know %f is for double but why '2.' in front of 'f'?

有关 printf 格式字符串的信息,您最好查阅好的参考资料 material -- 我建议在线手册页(搜索关键字“man printf”),尽管语言规范文件是最终权威。教科书和教程通常不会涵盖所有细节,细节很多。

如果这样做,您会发现 2 是(最小)字段宽度,. 对于 .0 是 shorthand,精度规范指示 printf 发出零小数位。

Right before the end we set 'dgt' to 'c-48' i want to know why '-48'

必须了解数字 字符 和它们所代表的数字之间存在差异。 48 是字符 '0' 的 ASCII 码,C 要求每个后续十进制数字的代码都比前一个大 1,因此,假设实现使用 ASCII 兼容字符代码, dgt-48 将任何十进制数字字符转换为其对应的数值。

但是,将其表达为 dgt - '0' 会更安全、更地道。这更清楚,因为它至少提供了有关正在发生的事情的线索,并且它甚至适用于使用与 ASCII 不兼容的字符编码的实现。