为什么我要做c-48?\a和%2.f是什么意思?
这个程序是一个简单的计算器。 首先很抱歉我的英语不好,我想知道“\a”和“%2.f”是什么意思 我知道%f代表double,但为什么是'2'。在'f'前面? 在结束之前,我们将“dgt”设置为“c-48”,我想知道为什么“-48” 我是一个信息型的学生,我在一开始,你有一些特别的提示给我吗为什么我要做c-48?\a和%2.f是什么意思?,c,visual-studio,performance,variables,calculator,C,Visual Studio,Performance,Variables,Calculator,这个程序是一个简单的计算器。 首先很抱歉我的英语不好,我想知道“\a”和“%2.f”是什么意思 我知道%f代表double,但为什么是'2'。在'f'前面? 在结束之前,我们将“dgt”设置为“c-48”,我想知道为什么“-48” 我是一个信息型的学生,我在一开始,你有一些特别的提示给我吗 #include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { printf("
#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();
}
#包括
#包括
#包括
int main()
{
printf(“简单计算器:\n有效输入为+-*/=和数字0,…,9\n”);
printf(“您的输入:\n”);
双r=0.0;
双dgt=0.0;
字符lst_opt='+';
常数int nxt_dgt=1;
常数int nxt_opt=2;
int nxt_npt=nxt_dgt;
而(1)
{
char c=_getch();
开关(c)
{
格“+”:
案例'-':
案例“*”:
案例“/”:
如果(nxt_npt!=nxt_opt)
{
printf(“\a”);
打破
}
printf(“%c”,c);
lst_opt=c;
nxt_npt=nxt_dgt;
打破
案例“=”:
如果(nxt_npt!=nxt_opt)
{
printf(“\a”);
打破
}
printf(“\n=%.2f”,r);//双精度,但为什么是.2?
nxt_npt=nxt_opt;
打破
案例“0”:
案例“1”:
案例“2”:
案例“3”:
案例“4”:
案例“5”:
案例“6”:
案例“7”:
案例“8”:
案例“9”:
如果(nxt_npt!=nxt_dgt)
{
printf(“\a”);
打破
}
printf(“%c”,c);
dgt=c-48;
开关(lst_opt)
{
案例“+”:r+=dgt;中断;
案例'-':r-=dgt;中断;
案例“*”:r*=dgt;中断;
案例“/”:r/=dgt;中断;
}
nxt_npt=nxt_opt;
打破
}
}
_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
,一个转义字符,意思是“换行符”,它也是一个转义字符,意思是“警报”,当“打印”时会发出嘟嘟声。
您可以找到信息(包括其他特殊转义字符)
- 为什么减48
if(c=='3')i=3代码>,它使用字符“0”~“9”在中的排序方式。你可以看到,'0'~'9'是从48到57紧密排列的。也就是说,'0'-48
生成的结果为0,其他结果也是如此
%2.f
您知道%f
用于打印float
变量,这很好,但是还有更多需要了解的内容。您可以格式化如何打印变量。
2.
代表“打印至少2个字符宽的浮点数,也可以是无”
应打印“小数点后的第1位”。更多printf()
格式信息
“\a”是什么意思
这一点实际上有些模糊。出现在字符常量或字符串文本中的转义序列\a
表示一个字符,当发送到终端时,该字符会在不改变输出位置的情况下发出和/或显示警报信号。信号的细节是特定于环境的,但它可能会发出嘟嘟声或导致屏幕闪烁或类似情况。这是很少使用这些天
&“%2.f”我知道%f代表double,但为什么是“2”。在“f”前面
关于printf
格式字符串的信息,最好查阅好的参考资料——在线手册页(搜索关键字“man printf”)是我的建议,尽管语言规范文档是最终权威。教科书和教程通常不涵盖所有的细节,其中有很多
如果这样做,您会发现2
是一个(最小)字段宽度,
是.0
的缩写,这是一个精度规范,指示printf
发出零个小数位数
在结束之前,我们将“dgt”设置为“c-48”,我想知道为什么“-48”
必须理解数字字符和它们所代表的数字之间存在差异。48是字符'0'
的ASCII代码,C要求每个后续十进制数字的代码大于前一个,因此,假设实现使用ASCII兼容字符代码,dgt-48
将任何十进制数字字符转换为其对应的数值
但是,这将更安全、更习惯地表示为dgt-“0”
。更清楚的是,它至少提供了一个关于正在发生什么的线索,甚至在使用不兼容ASCII的字符编码的实现上也能起作用。48应该是“0”