#c #string #append #c -standard-library
#c #строка #добавить #c -standard-library
Вопрос:
Я столкнулся со странным кодом в решении проблемы программирования, и я не смог найти ни одной хорошей идеи по этому поводу. Здесь,
#include <iostream>
#include <bits/stdc .h>
using namespace std;
int main() {
int count=8;
string temp="Hello ";
temp =count '0';
cout<<temp;
return 0;
}
Output is: Hello 8
целочисленная переменная count была добавлена к строке даже без приведения типа целочисленной переменной. Я предполагаю, что это сработало из-за ‘0’, но что это за процесс или метод.
Ответ №1:
целочисленная переменная count была добавлена к строке даже без приведения типа целочисленной переменной.
Нет, целочисленная переменная не была добавлена. Единственной подходящей перегрузкой для =
оператора является перегрузка, которая принимает один char
параметр и в конечном итоге добавляет один символ в строку. Тип целочисленного значения преобразуется в char
тип, а остальное — история.
Итак, добавление 8 к символу '0'
, что неудивительно, дает символ '8'
. Конечно, все идет в интересном направлении, если ваша целочисленная переменная отрицательна или больше 9. Вы должны попробовать, результаты должны быть наглядными.
Ответ №2:
Компилятор выполнит неявное преобразование для разрешения
temp =count '0';
Это можно интерпретировать следующим образом для лучшего понимания
temp.operator =(static_cast<char>(count static_cast<int>('0')));
Таким образом, значение ascii 0
будет добавлено к count
, и это будет 56
в десятичном формате, который будет преобразован обратно в ascii 8
.
В operator =
char
качестве аргумента будет инициирован перегруженный for 8
.
Вы даже можете преобразовать свои 3 строки, как показано в приведенном ниже коде, и вы все равно получите тот же результат.
int count=56;
string temp="Hello ";
temp = count;
Комментарии:
1. ну, нет. Оно может быть преобразовано в некоторый эквивалент этого, но компилятор не будет сначала генерировать этот (промежуточный) код на C …
2. @JHBonarius: Я вставил промежуточный код, который был сгенерирован cppinsights.io Возможно, разные компиляторы будут решать эту проблему по-разному. Но это правильное значение для одного из компиляторов.
3. CppInsights — это / не / компилятор, а интерпретатор, основанный на компиляторе clang. Он визуализирует то, что происходит внутри. Фактический компилятор clang выполняет что-то с внутренним представлением (AST, ведущим к IR и т. Д.)
4. @JHBonarius: То есть компилятор никогда не будет выполнять приведение? Я согласен с тем, что такого промежуточного кода, сгенерированного подобным образом, не будет. Я немного изменю свой ответ.
5. Компилятор не будет выполнять неявное приведение; такой вещи не существует. Компилятор выполнит неявное преобразование . Приведение — это то, что вы пишете в своем исходном коде, чтобы сообщить компилятору выполнить преобразование. Приведение всегда является явным.