在C ++中将char转换为int的原因是什么?
答案 0 :(得分:1)
将public class ReadLine {
public static void main(String[] args) throws IOException {
File f = new File("");
BufferedReader br = new BufferedReader(new FileReader(f));
try {
String line = br.readLine();
while(line != null) {
line = br.readLine();
final Scanner s = new Scanner(line);
while(s.hasNextInt()) {
final int i = s.nextInt();
// code using i here
}
}
} finally {
br.close();
}
}
值转换为 QVector<double> x(96), y(96);
for (int i=0; i<95; ++i)
{
x[i] = i*900+22500;
y[i] = someValues loaded from db
}
ui->customPlot->addGraph();
ui->customPlot->setBackground(QBrush(QColor(239, 239, 239, 255)));
ui->customPlot->graph(0)->setData(x, y);
ui->customPlot->xAxis->setRange(21600, 108000);
ui->customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime);
ui->customPlot->xAxis->setDateTimeFormat("h:mm");
//ui->customPlot->xAxis->setTickStep(7200);
很少有意义。
首先,一些术语。 强制转换是一种显式转换,通过强制转换运算符指定,可以是C样式char
,也可以是int
之类的C ++强制转换。 隐式转换不是强制转换。你有时会看到短语&#34;隐式演员&#34;,但在C ++(或C)中没有这样的东西。
大多数算术运算符如果它们的整数类型比(type)expr
或static_cast<type>(expr)
更窄,则会提升它们的操作数。例如,在表达式int
中,unsigned int
的{{1}}值在添加之前会提升为'0' + 1
,结果的类型为char
。< / p>
如果要为0
对象分配int
值,只需指定它即可。隐式转换该值,就像使用强制转换一样。
在大多数情况下,隐式转换优先于强制转换,部分原因是它们不易出错。语言规则通常指定的隐式转换是正确的。
在某些情况下,您确实需要将int
投射到char
。这是一个:
int
重载的char
运算符接受int
或char c = 'A';
std::cout << "c = '" << c << "' = " << static_cast<int>(c) << "\n";
(以及许多其他类型),因此没有隐式转换。如果没有强制转换,相同的<<
值将被使用两次。输出(假设基于ASCII的字符集)是:
char
这是一种不寻常的情况,因为int
运算符对类型char
和c = 'A' = 65
的处理方式截然不同。在大多数情况下,由于<<
已经是整数类型,因此使用char
或int
值并不重要。
我可以想到另一个非常模糊的可能性。 char
值几乎始终提升为char
。但是对于普通int
未签名且 char
和int
宽度相同的实现,普通char
会提升为{{1 }}。只有在char
和int
时才会发生这种情况。您不太可能遇到这样的实施。即使在这样的系统上,char
是否被提升为unsigned int
或CHAR_BIT >= 16
通常也无关紧要,因为任一促销都会产生正确的数值。
答案 1 :(得分:0)
一般来说,这应该很少发生,因为它在使用char时何时相当明确,何时使用int。
但是,如果您对一组字符执行算术感兴趣,则需要更多内存来存储整体值,因此您通常可以使用int(或任何其他数据类型)来存储整体值
通过这样做,您可能会更多地隐式地将字符转换为所选的数据类型。
但是,您也可以在计算之前或计算过程中显式地转换这些字符(尽管C ++的更高版本会为您处理此问题)。
这是一种更常见的用于铸造字符的方法。
然而在实践中,通常可以避免这种情况,因为从长远来看,它可以制造更强大的清洁代码