为什么我必须做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 不兼容的字符编码的实现。
这个程序是一个简单的计算器。 起初抱歉我的英语不好,我想知道 '\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 不兼容的字符编码的实现。