Russian Qt Forum
Ноябрь 23, 2024, 08:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Мелочь, но мало ли кто не знает)  (Прочитано 6297 раз)
OKTA
Гость
« : Февраль 13, 2014, 17:48 »

Уверен большинству это известно, но уверен, что есть и такие, кому нет, так что будет полезно) Вопрос, вобщем-то, вот в чем -
Что выдадут следующие команды:

Код:
printf("%d", sizeof("a"));
printf("%d", sizeof('a'));
printf("%d", sizeof(char));

А тут самопроверка) http://codepad.org/vy9jVYxA
« Последнее редактирование: Февраль 13, 2014, 19:15 от OKTA » Записан
Bepec
Гость
« Ответ #1 : Февраль 13, 2014, 18:05 »

Ммм... не имел дела с printf уже давно Веселый
1) 8
2) 4
3) ?

Как же я ошибался Веселый поду веревку искать Веселый

Но в принципе ход мыслей был правильный Веселый
« Последнее редактирование: Февраль 13, 2014, 18:15 от Bepec » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Февраль 13, 2014, 18:29 »

1. размер указателя (4 или 8 )
2. либо 1 либо 4 (не знаю приведется ли тут к инт)
3. 1
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #3 : Февраль 13, 2014, 18:47 »

Тут механику нужно знать Веселый
Записан
OKTA
Гость
« Ответ #4 : Февраль 13, 2014, 19:14 »

Тут механику нужно знать Веселый
Что однако крайне полезно))
Записан
Bepec
Гость
« Ответ #5 : Февраль 13, 2014, 19:16 »

В общем то у меня знание было, ток чуть замороченное ) В пропорциях совпадает, но вот тонкости Улыбающийся Хотя тем не менее круто, потому что я использовал sizeOf года 4 назад в первый и последний раз Веселый
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Февраль 13, 2014, 21:00 »

1. размер указателя (4 или 8 )
2. либо 1 либо 4 (не знаю приведется ли тут к инт)
3. 1
почти угадал (компилятор от студии-2012):
2 (почему?)
1
1
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #7 : Февраль 13, 2014, 21:04 »

почти угадал (компилятор от студии-2012):
2 (почему?)
в порядке бреда - размер самих данных, то есть 'a', 0x00?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #8 : Февраль 13, 2014, 21:17 »

sizeof для типа данных вернет размер самого типа, поэтому sizeof(char) вернет 1. Для переменной sizeof возвращает размер занимаемой памяти (а не размер указателя). Поэтому sizeof("a") вернет 2 (не забываем про \0 в конце строки), а sizeof('a') вернет 1, т.к. это размер одного символа.
Записан
OKTA
Гость
« Ответ #9 : Февраль 13, 2014, 21:23 »

а в Си sizeof('a') отдает 4, ибо операция '' немного иначе трактуется)
Записан
Bepec
Гость
« Ответ #10 : Февраль 13, 2014, 22:07 »

Точнее современное sizeOf возвращает размер от char Веселый А указатель на данные  преобразуется в массив данных. MSDN форева.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Февраль 14, 2014, 15:44 »

2 (почему?)
Потому что "rvalue". Распишем так
Код
C++ (Qt)
char test[2] = ['a', 0];
При передаче в ф-цию (напр strlеn("a")) будет использован адрес, т.к. есть прототип ф-ции. Но для sizeof никаких указаний не было - ну он и вернет размер массива.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Февраль 14, 2014, 19:18 »

спасибо. Hellraiser, в общем-то, доступно расписал.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #13 : Февраль 15, 2014, 20:03 »

Точнее современное sizeOf возвращает размер от char Веселый А указатель на данные  преобразуется в массив данных. MSDN форева.

printf("%d", sizeof("a"));

"a" - это не указатель на константу. Это - массив констант из двух элементов: 'a' и терминатор-нуль.
Он имеет тип const char[2];

sizeof(const char[2]) вернет 2, потому что размер массива - это размер типа элементов массива умноженное на количество элементов.


Тезис: литерные константы вида "trololo" имеют тип "массив констант типа char"

Доказательство:

Компилятор имеет право неявно приводить тип данных "массив" к типу данных "указатель". Но это не одно и тоже. Это два принципиально разные типы данных.

А раз это разные типы данных, значит они должны подчиняться правилу выбора прендендента среди перегруженных функций.

Обратите внимание на этот код:
http://rextester.com/IZG49875

Код:
//Title of this code

#include <iostream>
using namespace std;

template<size_t N>void View( const char (&a)[N] )
{
    cout<< "it is array\n";
    for( const auto& i: a)
        cout<< "item = "<< i<<endl;
}

template<size_t N>void View( const char* p )
{
    cout<< "it is pointer\n";
}


int main()
{
    cout << "Hello, world"<<endl;
    
    cout << typeid("Hello, world").name()<<endl;
    
    View("Hello, world");
}


Обратите внимание: есть две функции. одна принимает указатель, а другая - ссылку на массив.

Когда есть перегруженные функции, то компилятор в первую очередь выбирает ту, чей аргумент точно соответствует типу заявленной переменной.

И только если такой среди перегрузок нету, только тогда он пытается скастить тип заявленной переменной к типам аргументов прентендентов, и если какая то подойдет - выберет её.


Таким образом, если литерная константа "Hello, world" это массив, то должна запустится перегрузка, которая принимает ссылку на массив.

И только, если литерная константа оказалась бы не массивом, только тогда, компилятор попытался бы запустить версию с указателем.

Как видите, запустилась версия с массивом. Следовательно литерная константа действительно имеет тип "массив констант типа char".

Тезис доказан.
« Последнее редактирование: Февраль 15, 2014, 20:18 от _Bers » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 23.