В чём разница одинарных и двойных кавычек в С++?

Написал такой код:

#include <string>
std::string fakeBin(std::string str){
    for (int i = 0; i < str.length(); i++){
        str[i] = ((str[i] - '0') > 4) ? '1' : '0';
    }
    return str;
}

Со своей функцией он справляется, но при написании столкнулся с проблемой и мне стало интересно. Если в ? '1' : '0' заменить кавычки на двойные, то код перестаёт работать. С чем это связано, и чем различаются одинарные и двойные кавычки в C++?


Ответы (2 шт):

Автор решения: LolPopGames

Спасибо @avp за исправление в комментариях!

"" и '' обозначают разные типы данных


Есть тип char, он хранит какое-то однобайтовое число

В си и си++ есть '', указанный в нём символ, повторяюсь символ, не символы, будут интерпретироваться как соответствующее число char

Интерпретируемым типом будет являтся const char

Например:

Латинская a будет интерпретирована как 0x61 (или 97 в десятиричной)


Есть тип const char *,

Это указатель на массив (принято называть строкой), а если точнее, то это указатель на первый символ (типа const char) этой строки

Когда мы пишем "", такую строку принято называть строковым литералом

При взаимодействии со строкой (например: с помощью функций) мы последовательно читаем символы, пока не наткнёмся на спец символ \0 (нулевой символ)

Также, когда мы будем использовать "", в конце автоматом появится \0

При использовании строкового литерала, он будет вшиваться в исполняемый файл

Например:

#include <iostream>

int main()
{
    //           ↓ Строковой литерал встраивается в исполняемый файл, и заканчивается на \0
    std::cout << "Hello, World!" << std::endl;

    return 0;
}

В чём проблема?

str[i] имеет тип char, а когда Вы использовали "", то он имел тип const char *

Преобразование с типа const char * в тип char невозможно, поэтому и возникла ошибка

→ Ссылка
Автор решения: MarianD

Символ 'A' забирает 1 байт, строка "A" 2 байта (это поле из 2 байтов, самого символа А и бинарного нуля \0 - признака конца строки):

введите сюда описание изображения

В вашей команде str[i] = ... ожидается на правой стороне 1 символ, а не строка.

→ Ссылка