Как целое число может быть добавлено к строке, если указано ‘0’

#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. Компилятор не будет выполнять неявное приведение; такой вещи не существует. Компилятор выполнит неявное преобразование . Приведение — это то, что вы пишете в своем исходном коде, чтобы сообщить компилятору выполнить преобразование. Приведение всегда является явным.