【问题标题】:Why I have to do c-48? and what does \a and %2.f mean? [closed]为什么我必须做 c-48? \a 和 %2.f 是什么意思? [关闭]
【发布时间】:2021-03-06 15:13:28
【问题描述】:

这个程序是一个简单的计算器。 起初很抱歉我的英语不好,我想知道'\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();
}

【问题讨论】:

  • 48 应该是 '0'

标签: c visual-studio performance variables calculator


【解决方案1】:
  • \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 个字符宽,也没有 应该打印小数位数”。更多printf()格式化信息Here

【讨论】:

    【解决方案2】:

    '\a'是什么意思

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

    & '%2.f' 我知道 %f 是双倍的,但为什么是 '2.'在'f'前面?

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

    如果你这样做了,你会发现2 是一个(最小)字段宽度,..0 的简写,这是一个指示printf 发出零小数位的精度规范。

    在最后我们将“dgt”设置为“c-48”我想知道为什么是“-48”

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-15
        • 2011-12-09
        • 2021-01-25
        • 2018-07-17
        • 2022-11-10
        • 2012-06-14
        • 2017-09-12
        • 2015-09-02
        相关资源
        最近更新 更多