#include <iostream>
using std::cout;
using std::endl;
int main(void) {
std::string fx = "6x^2+6x+4";
int part1 = fx[0] * fx[3];
cout << fx[0] << endl;
cout << fx[3] << endl;
cout << part1;
}
所以我有这个字符串,fx[0]
和fx[3]
显然是整数:当我把它们打印到控制台时,它们打印出来很好;然而,part1
(它们的乘法)等于一些完全不相关的数字?有人能帮忙吗?
输出如下:
6
2
2700
您的fx[0]
和fx[3]
变量类型为char
(其中在c++中是整数类型)。但是,fx
字符串的这两个元素中的实际值将是数字6
和2
的表示,而不是这些数字的数值。
通常,这些表示将是ASCII码(但这不是必需的);然而,所要求的是数字0
到9
的表示具有连续的顺序值。因此,通过减去数字0
的值,可以转换为它们的数字表示形式。
在您的示例中,下面一行将进行转换:
int part1 = (fx[0]-'0') * (fx[3]-'0');
你在打印fx[0]
和fx[3]
时看到正确的值的原因是因为接受char
参数的cout <<
操作符的版本设计为打印所表示的字符(而不是它的'ASCII'代码);然而,int
类型(如part1
)的cout <<
运算符将打印内部表示的实际值。(尝试将其中一行更改为cout << (int)fx[0] << endl;
以查看差异。)
注:不要忘记#include <string>
头—有些实现在<iostream>
头中实现隐式,但不要依赖它!
首先,string::operator[]
返回一个char
…然后,可以将char
转换为int
,并且转换工作检查ASCII表中的ID(在您的情况下)
在ASCII码中,"6"
和"2"
的ID分别是54
和52
(例如可以在这里查看)…所以你的程序取两个char
,将它们转换为int
,并将它们相乘(54 * 50 = 2700)
如果你需要将它们解释为它们所代表的整数值,你可以检查这个答案:
int val = '6' - '0'; // val == 6
字符是表示某种表示法(通常是ASCII表)中的字形的值。字符的数值与打印在屏幕上的字形不一样。将看起来像数字的字符转换为实际的"基于0的"字符。数值,从字符值中减去'0'。
(fx[3]-'0'])将是位置3所表示的字符的数值。
您正在增加字符类型。因此,字符'6'和'2'将分别转换为其整数值54和50,然后应用乘法。这是基于c++类型转换规则工作的。然后你会得到2700。尝试修改后的样例代码
#include <iostream>
using std::cout;
using std::endl;
int main(void) {
std::string fx = "6x^2+6x+4";
int part1 = fx[0] * fx[3];
cout << fx[0] << endl;
cout << fx[3] << endl;
cout << part1;
cout << std::endl;
cout << (int)fx[0] << " " << (int)fx[3] << std::endl;
}
和结果
6
2
2700
54 50