Непонятное выражение

Тема в разделе "C и С++ FAQ", создана пользователем Yalud, 18 янв 2007.

Статус темы:
Закрыта.
  1. Yalud

    Yalud Гость

    Приведу пример элементарного кода:

    int a;
    int b;
    a=10;
    b=(float)a;

    Объясните, каков смысл имеет выражение b=(float)a; При этом в результате эксперементов выяснилось, что вместо типа float, может стоять char, int и подозреваю другие типы. В результате b всегда равен 10, а его тип не может измениться, т.к он определен ранее. Данное выражение не похоже на обращение к функции. Выражение определено во встроенной библеотеке, там же где определены классы int, char и другие фундаментальные классы. В описание языка C++ я не нашел никакого объяснения. Выражение не подходит не под одно определение языка C++. Кто знает смысл поясните!!!
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Это выражение означает приведение типа. Т.е. изначально переменная а имеет целое значение 10, а если бы переменная b имела вещественный тип, то при присваивании формат числа был бы изменен с целого на вещественный. В твоем примере в преобразовании типов необходимости нет, т.к. обе переменные изначально имеют один тип
     
  3. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    <!--QuoteBegin-Yalud+18:01:2007, 06:11 -->
    <span class="vbquote">(Yalud @ 18:01:2007, 06:11 )</span><!--QuoteEBegin-->В описание языка C++ я не нашел никакого объяснения. Выражение не подходит не под одно определение языка C++.
    [snapback]53544" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    нет слов
     
  4. Yalud

    Yalud Гость

    Да возможно я малоинформирован по данной теме. Видимо в большинстве учебников данный вариант преобразования не описывается, т.к. думают, что такой элементарный пример не требует внимания ,в силу своей простоты для понимания и его смысл и так всем ясен(возможно я немного преувеличиваю!).

    Но согласитесь если вглядется в детали данного выражения можно сделать вывод, что дополнение (float) является лишьним. Если я пытаюсь переменной скажем Int присвоить переменную char, то ежу понятно что это можно сделать только приведя один тип к другому, либо никак. Зачем же дополнительно приписывать к переменной аргумент float (я даже не знаю как правильно это называется аргумент, атрибут, оператор, тип или еще что). Понятное дело вы скажете что просто таковы правила языка и мы должны их выполнять, а если не нравится, то разработай свой язык и делай там что хочешь. Но факт наличия лишней информации в инструкции сразу ввел меня в заблуждение, почему я и решил разобратся в деталях. (На самом деле я до сих пор сомневаюсь, что эта информация лишьняя, просто ее смысл до сих пор не раскрыт)

    Если вам все досконально понятно, как в таком случае вы объясните следующий пример:

    int a;
    char b;
    b='y';
    a=(float)b;

    Что в этом коде происходит? (Компилятор все инструкции пропускает не ругаясь)
    У меня три варианта:
    1) Переменной a типа int присваивается значение переменной b типа char(с приведением ее к типу int) тогда возникает вопрос при чем здесь (float)
    2) Переменной a типа int присваивается значение переменной b типа char(с приведением ее к типу float)
    в этом случае вопрос? Как переменной типа int можно присвоить значение переменной типа float? Абсурд!
    3) Переменной a типа int присваивается значение переменной b типа float(c приведением ее к типу int) Но компилятору то при этом хорошо известно, что переменная b определена ранее с типом char.

    Если можно поясните что происходит с переменными на битовом(байтовом уровне).
     
  5. zubr

    zubr Гость

    Происходит вот что:
    Переменная a - 4-байтная, а переменная b - однобайтная, значит после присвоения a=b, значение переменной b загружается в младший байт переменной a. Если до присвоения переменная a==0, то после присвоения обе переменные будут иметь одно значение, в противном случае разные.
    Что касается приведения типа к float, это нужно, чтобы компилятор знал, что при дальнейших операциях с переменной a, надо обращаться как с вещественным числом. К примеру, если a оставить целочисленным числом и выполнить деление этого числа на другое целочисленное число, то результат компилятор тоже сделает целочисленным (без остатка от деления), хотя на самом деле он может быть вещественным. В случае приведения типа результат будет - вещественное число.
     
  6. Yalud

    Yalud Гость

    Спасибо, теперь я начинаю понимать. По сути переменная a меняет свой тип с int на float. Мое заблуждение было в том, что я считал, что тип переменной не может меняться по ходу программы. А если бы переменная a в вышеприведенном примере была бы определена как char , я бы в итоге получил однобайтную переменную типа float ?
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Yalud+19:01:2007, 07:27 -->
    <span class="vbquote">(Yalud @ 19:01:2007, 07:27 )</span><!--QuoteEBegin-->По сути переменная a меняет свой тип с int на float. Мое заблуждение было в том, что я считал, что тип переменной не может меняться по ходу программы.
    [snapback]53650" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    А тип переменной и не может менятся! Меняется формат представления ее значения
     
  8. Yalud

    Yalud Гость

    Данное обстоятельство опять вносит путаницу в мое сознание. Выходит мы можем получить переменную типа char с форматом представления данных типа float. Тогда получается тип переменной говорит только о ее размере в байтах.
    А когда мы определяем переменную например таким способом :
    int a;
    мы сообщаем компилятору, что у нас есть переменная с размером 4 байта(тип int), и форматом представления как целочисленная (формат int). При этом тип(размер) переменной по ходу программы изменить нельзя, а ее формат можно. Думаю в этом есть смысл.
     
  9. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    int a;
    char b;
    a=b;

    a==b вне зависимости от начального значения a, компилятор просто дополнит b до нужного размера.

    Или я чего не понимаю?=(
     
  10. Yalud

    Yalud Гость

    На сколько я понял. формат представления данных у int и char одинаковый( называется целочисленный) единственное различие в размере переменных int - 4 байта(диапазон значений от -2147483648 до 2147483647) char - 1 байт(диапазон значений от -128 до 127). При присвоении a=b один единственный байт переменной b скопируется в младший байт переменной a, при этом оставшиеся байты переменной a останутся без изменения(они вполне могут быть ненулевыми) по этому никто не горантирует, что a==b. Именно это писал Zubr немного выше, если я правильно понял.
     
  11. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    Я отлично понял, что имел ввиду Zubr. Просто считаю, что он ошибается, видимо ввиду раннего времени(или очень позднего :) ) ответа.
     
  12. zubr

    zubr Гость

    Да, признаюсь, с присвоением a=b был не прав.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей