两个整数相乘结果完全不相关?


#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字符串的这两个元素中的实际值将是数字62的表示,而不是这些数字的数值。

通常,这些表示将是ASCII码(但这不是必需的);然而,所要求的是数字09的表示具有连续的顺序值。因此,通过减去数字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分别是5452(例如可以在这里查看)…所以你的程序取两个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