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

时间:2021-03-06 15:13:28

标签: c visual-studio performance variables calculator

这个程序是一个简单的计算器。 首先抱歉我的英语不好,我想知道 '\a' 和 '%2.f' 是什么意思 我知道 %f 是双倍的,但为什么是“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();
}

3 个答案:

答案 0 :(得分:1)

  • \a 是什么意思?

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

  • 为什么是负 48?

在代码中,它试图从一个字符中获取一个整数。它使用字符 '0'~'9' 在 ACSII Table 中的排序方式,而不是像 if(c == '3') i = 3; 这样的操作。可以看到,'0'~'9'从48到57是紧密排列的,也就是说,'0' - 48的结果是0,其他的也一样。

  • %2.f

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

答案 1 :(得分:1)

<块引用>

'\a'是什么意思

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

<块引用>

& '%2.f' 我知道 %f 是 double 但为什么是 '2.'在'f'之前?

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

如果这样做,您会发现 2 是(最小)字段宽度,而 ..0 的简写,指示 {{1} } 发出零小数位。

<块引用>

就在结束之前,我们将 'dgt' 设置为 'c-48' 我想知道为什么是 '-48'

理解数字字符和它们所代表的数字之间是有区别的。 48 是字符 printf 的 ASCII 码,C 要求后面的每个十进制数字都比前一个大一,所以,假设实现使用 ASCII 兼容的字符代码 , '0' 将任何十进制数字字符转换为其相应的数值。

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

答案 2 :(得分:0)

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

相关问题