Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
#1

Условный оператор - C++

13.05.2013, 16:22. Просмотров 625. Ответов 19
Метки нет (Все метки)

Здравствуйте!
Есть такой вопрос:
Что выведет следующая программа? Почему она выводит именно это? Почему в языке С сделано именно так? Как можно в языке сделать иначе? Какие тут плюсы и минусы?

C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void)
{
        if (-1 > sizeof(int))
                printf("yes\n");
        else
                printf("no\n");
        
        return 0;
}
Собственно, что она выведет и почему - понятно. А вот следующие 3 вопроса мне не очень понятны. Подскажите, пожалуйста, в какую сторону "копать"?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2013, 16:22     Условный оператор
Посмотрите здесь:

Условный оператор if - C++
Добрый день! есть следующий код программы на C++: #include&lt;cmath&gt; #include&lt;iostream&gt; int main(){ l: double a; ...

C (условный оператор) - C++
помогите решить задачи (кроме 3):

Условный оператор IF - C++
Содержание: 1+d sin d/a (i-1)i+{a}^{2} i+2/3x ...

Условный оператор. - C++
Даны три действительных числа. Выбрать из них те, которые принадлежат интервалу (1, 3).

УСЛОВНЫЙ ОПЕРАТОР (IF) - C++
здравствуйте, подскажите пожалуйста в чем ошибка:Дано 3 числа сколько среди них положительных #include &lt;stdio.h&gt; #include&lt;math.h&gt; ...

Условный оператор - C++
Добрый день,нужна помощь в написании кода по заданию. Составить систему неравенств на основании графической схемы: Пока что...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
13.05.2013, 17:09     Условный оператор #2
ну как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
 
 
int main(void)
{
        if (-1)
                printf("yes\n");
        else
                printf("no\n");
        getchar ();
        //return 0;
}
Проще вы укажите что вам именно нужно изменить,просто достаточно вариантов как можно изменить программу...
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 17:14  [ТС]     Условный оператор #3
Поправьте меня если я не прав. Немного почитав про целые типы, пришел к выводу, что sizeof(int) - беззнаковое число, максимальное значение которого в двоичном коде будет 111...111. В свою очередь -1 - целое значение со знаком, которое дает в двоичном коде тот же набор бит 111...111. Компилятор считает, что -1 - это максимальное беззнаковое число, которое, конечно, больше чем 4. Поэтому условие выполняется. Пока мысли такие
Я просто хочу понять, как компилятор все это дело обрабатывает, что получается на выходе такая штука
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.05.2013, 17:20     Условный оператор #4
FacelessShadow, что??? -1 в двоичном коде 10000...001. И никак не то,что Вы написали. Это во-первых. Во-вторых,если написать -2, то ничего не изменится.

Добавлено через 1 минуту
FacelessShadow, можно конвертировать в знаковый тип. что-то типа int(sizeof(int))
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 17:20  [ТС]     Условный оператор #5
metaluga145, цитата с вики
Однако для большинства современных процессоров обычным представлением чисел со знаком является дополнительный код. Максимальное положительное число представляется двоичным кодом 0111…111, максимальное по модулю отрицательное кодом 1000…000, а код 111…111 соответствует −1
Тогда, объясните, пожалуйста, почему так получается?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.05.2013, 17:27     Условный оператор #6

Не по теме:

Цитата Сообщение от FacelessShadow Посмотреть сообщение
Однако для большинства современных процессоров обычным представлением чисел со знаком является дополнительный код. Максимальное положительное число представляется двоичным кодом 0111…111, максимальное по модулю отрицательное кодом 1000…000, а код 111…111 соответствует −1
Я видимо пользуюсь устаревшим процессором




Цитата Сообщение от FacelessShadow Посмотреть сообщение
Тогда, объясните, пожалуйста, почему так получается?
10....01 все-равно больше,чем 000...100

Добавлено через 1 минуту
Даже пускай я не прав, а правы Вы. человеку это и до этого было ясно, а основной вопрос остался не закрытым
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 17:33  [ТС]     Условный оператор #7
metaluga145, 000...100 - это я так понимаю 4? А что такое 10...01?
Основной вопрос, по сути, как можно переписать это дело? Я так понял, что как вариант if (-1). И почему в С именно так сделано?

Но почему работает
C
1
2
3
4
int a = -1;
 
if(a)
....
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.05.2013, 17:37     Условный оператор #8
FacelessShadow, да. 00...100=4, а 100..001-это прямой код -1(но как Вы говорите, оно представляется не в таком виде).


Цитата Сообщение от FacelessShadow Посмотреть сообщение
Я так понял, что как вариант if (-1)
что это за вариант я не сильно понимаю. Это условие всегда правда. Как оно отвечает на вопрос, не знаю

Мой вариант перевод в знаковый тип.
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 17:42  [ТС]     Условный оператор #9
metaluga145, Ваш перевод в знаковый тип - это решение проблемы. А тут, как я понимаю, в условии будет всегда истина => можно просто в условие поставить -1
badLogic
1 / 1 / 0
Регистрация: 10.04.2013
Сообщений: 41
13.05.2013, 17:56     Условный оператор #10
Как можно в языке сделать иначе?
Тернарный оператор, должно работать:
C++
1
-1 > sizeof(int) ? printf("yes\n"): printf("no\n");
ValeryS
Модератор
6541 / 5007 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
13.05.2013, 18:03     Условный оператор #11
Цитата Сообщение от metaluga145 Посмотреть сообщение
FacelessShadow, что??? -1 в двоичном коде 10000...001.
час еще
-1 1111 1111 для байта
ну и для других тоже
все единицы
если к этому числу прибавить 1 то будет 0 (-1)+1=0
можно по другому
чтобы перевести число в дополнительный код нужно инвертировать и добавить единицу
0000 0001
1111 1110 инвертировали
1111 1111 добавили 1 получили дополнительный код -1

Добавлено через 2 минуты
Цитата Сообщение от FacelessShadow Посмотреть сообщение
Как можно в языке сделать иначе?
пожалуйста
C++
1
if(unsigned int(-1)>unsigned int(sizeof(int))
C++
1
if(int(-1)>int(sizeof(int))
и будет срабатывать другая ветка
palva
2563 / 1785 / 252
Регистрация: 08.06.2007
Сообщений: 6,913
Записей в блоге: 4
13.05.2013, 18:18     Условный оператор #12
Процитирую из http://citforum.ru/programming/c/h13.shtml То есть идем по пунктам вниз и срабатывает последний пункт.
При выполнении операций производится автоматическое преобразование типов, чтобы привести операнды выражений к общему типу или чтобы расширить короткие величины до размера целых величин, используемых в машинных командах. Выполнение преобразования зависит от специфики операций и от типа операнда или операндов.

Рассмотрим общие арифметические преобразования.

1. Операнды типа float преобразуются к типу double.

2. Если один операнд long double, то второй преобразуется к этому же типу.

3. Если один операнд double, то второй также преобразуется к типу double.

4. Любые операнды типа char и short преобразуются к типу int.

5. Любые операнды unsigned char или unsigned short преобразуются к типу unsigned int.

6. Если один операнд типа unsigned long, то второй преобразуется к типу unsigned long.

7. Если один операнд типа long, то второй преобразуется к типу long.

8. Если один операнд типа unsigned int, то второй операнд преобразуется к этому же типу.

Таким образом, можно отметить, что при вычислении выражений операнды преобразуются к типу того операнда, который имеет наибольший размер.
Наверно можно найти ссылку посолиднее, какие-нибудь стандарты.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
и будет срабатывать другая ветка
Достаточно даже так:
C
1
if (-1 > (int) sizeof(int))
alkagolik
Заблокирован
13.05.2013, 18:23     Условный оператор #13
Цитата Сообщение от FacelessShadow Посмотреть сообщение
В свою очередь -1 - целое значение со знаком, которое дает в двоичном коде тот же набор бит 111...111. Компилятор считает, что -1 - это максимальное беззнаковое число, которое, конечно, больше чем 4. Поэтому условие выполняется
условно беззнаковый int "длинее", "больше" чем знаковый на один бит. По общему правилу вычисления условий в случае сравнения типов разных размеров -- тип меньшего размера неявно приводится к типу большего размера, далее вычисляется условное выражение и возвращается результат. В данном примере -1 будет приведен к беззнаковому числу 0xF...F, что безусловно больше чем беззнаковое 0x0..4. Почему сделано именно так -- неизвестно, но используя Си надо помнить о неявном приведении типов всегда и везде. Т.е. если функция принимает size_t, а мы передадим туда -1, то с точки зрения грамматики языка это не ошибка.

Цитата Сообщение от FacelessShadow Посмотреть сообщение
Как можно в языке сделать иначе?
явно привести макрос sizeof к знаковому типу int.

Цитата Сообщение от FacelessShadow Посмотреть сообщение
Какие тут плюсы и минусы?
минус -- то что написанное в исходном тексте противоречит тому что будет выполнено, но этот минус спорный, ибо его перекрывает плюс, а именно, программист обязан обладать квалификацией и знать почему написанное противоречит печати, и следовательно, не делать подобных семантических ошибок.
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
13.05.2013, 18:23     Условный оператор #14
FacelessShadow, у вас так же всегда выдаёт yes,т.к. в C++ 0 - это false ,а всё остальное правда...Можно конечно с битовыми полями поработать,но просто в условии как сделать иначе,а иначе можно множественными путями,вот человек сделал через тернарный оператор...
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 20:04  [ТС]     Условный оператор #15
Благодарю всех за ответы.

alkagolik, Вам спасибо огромное! Объяснили то, что хотел узнать
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
13.05.2013, 20:54     Условный оператор #16
Цитата Сообщение от alkagolik Посмотреть сообщение
макрос sizeof
какой такой макрос sizeof?
как можно макрос привести к чему-либо?
ValeryS
Модератор
6541 / 5007 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
13.05.2013, 22:23     Условный оператор #17
Цитата Сообщение от Kastaneda Посмотреть сообщение
какой такой макрос sizeof?
а это разве макрос?
alkagolik
Заблокирован
13.05.2013, 22:54     Условный оператор #18
да sizeof -- compile time сишный макрос.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
14.05.2013, 09:17     Условный оператор #19
Цитата Сообщение от ValeryS Посмотреть сообщение
а это разве макрос?
и я о чем.

Цитата Сообщение от alkagolik Посмотреть сообщение
да sizeof -- compile time сишный макрос.
Стандарт С++ 2003г.
5.3.3 Sizeof

The sizeof operator yields the number of bytes in the object representation of its operand. The operand
is either an expression, which is not evaluated, or a parenthesized type-id. The sizeof operator shall not
be applied to an expression that has function or incomplete type, or to an enumeration type before all its
enumerators have been declared, or to the parenthesized name of such types, or to an lvalue that designates
a bit-field. sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; the
result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 12:03     Условный оператор
Еще ссылки по теме:

Условный оператор - C++
Помогите решить задачу: Даны четыре целых числа a, b, c и d. Найти наименьшее из максимумов первой и второй пар чисел. Решить задачу,...

Условный оператор. - C++
Написала код программы выдаёт ошибки. :( Вычислить значение функции -ax в квадрате -b при x&lt;5 x+a/x при x&gt;5 ...

условный оператор IF - C++
Даны три вещественных числа. Возвести в квадрат те, которые положительные.

Условный оператор - C++
1)Составить программу для вычисления значения функции f(x) :http://higgs.rghost.ru/55956431/image.png 2)«Узник замка Иф». За многие годы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alkagolik
Заблокирован
14.05.2013, 12:03     Условный оператор #20
Kastaneda, да я уж и сам заглянул вчера.

Не по теме:

а на с++11 не накопил?

Yandex
Объявления
14.05.2013, 12:03     Условный оператор
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru