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

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

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

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

13.05.2013, 16:22. Просмотров 641. Ответов 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 вопроса мне не очень понятны. Подскажите, пожалуйста, в какую сторону "копать"?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2013, 16:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Условный оператор (C++):

Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки - C++
Здравствуйте. В С++ я абсолютный новичок, поэтому с первым же заданием возникли определённые трудности. Будьте добры, помогите решить. Буду...

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

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

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

Условный оператор if else - C++
Что не так? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; int main() { int x,y,z,max; cout&lt;&lt;&quot;Введите число...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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;
}
Проще вы укажите что вам именно нужно изменить,просто достаточно вариантов как можно изменить программу...
0
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 17:14  [ТС] #3
Поправьте меня если я не прав. Немного почитав про целые типы, пришел к выводу, что sizeof(int) - беззнаковое число, максимальное значение которого в двоичном коде будет 111...111. В свою очередь -1 - целое значение со знаком, которое дает в двоичном коде тот же набор бит 111...111. Компилятор считает, что -1 - это максимальное беззнаковое число, которое, конечно, больше чем 4. Поэтому условие выполняется. Пока мысли такие
Я просто хочу понять, как компилятор все это дело обрабатывает, что получается на выходе такая штука
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.05.2013, 17:20 #4
FacelessShadow, что??? -1 в двоичном коде 10000...001. И никак не то,что Вы написали. Это во-первых. Во-вторых,если написать -2, то ничего не изменится.

Добавлено через 1 минуту
FacelessShadow, можно конвертировать в знаковый тип. что-то типа int(sizeof(int))
0
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 17:20  [ТС] #5
metaluga145, цитата с вики
Однако для большинства современных процессоров обычным представлением чисел со знаком является дополнительный код. Максимальное положительное число представляется двоичным кодом 0111…111, максимальное по модулю отрицательное кодом 1000…000, а код 111…111 соответствует −1
Тогда, объясните, пожалуйста, почему так получается?
0
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 минуту
Даже пускай я не прав, а правы Вы. человеку это и до этого было ясно, а основной вопрос остался не закрытым
0
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)
....
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.05.2013, 17:37 #8
FacelessShadow, да. 00...100=4, а 100..001-это прямой код -1(но как Вы говорите, оно представляется не в таком виде).


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

Мой вариант перевод в знаковый тип.
0
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 17:42  [ТС] #9
metaluga145, Ваш перевод в знаковый тип - это решение проблемы. А тут, как я понимаю, в условии будет всегда истина => можно просто в условие поставить -1
0
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");
0
ValeryS
Модератор
6634 / 5041 / 466
Регистрация: 14.02.2011
Сообщений: 16,851
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))
и будет срабатывать другая ветка
0
palva
2614 / 1836 / 263
Регистрация: 08.06.2007
Сообщений: 6,995
Записей в блоге: 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))
0
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 Посмотреть сообщение
Какие тут плюсы и минусы?
минус -- то что написанное в исходном тексте противоречит тому что будет выполнено, но этот минус спорный, ибо его перекрывает плюс, а именно, программист обязан обладать квалификацией и знать почему написанное противоречит печати, и следовательно, не делать подобных семантических ошибок.
0
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
13.05.2013, 18:23 #14
FacelessShadow, у вас так же всегда выдаёт yes,т.к. в C++ 0 - это false ,а всё остальное правда...Можно конечно с битовыми полями поработать,но просто в условии как сделать иначе,а иначе можно множественными путями,вот человек сделал через тернарный оператор...
0
FacelessShadow
7 / 7 / 1
Регистрация: 07.05.2013
Сообщений: 136
13.05.2013, 20:04  [ТС] #15
Благодарю всех за ответы.

alkagolik, Вам спасибо огромное! Объяснили то, что хотел узнать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 20:04
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.05.2013, 20:04
Ответ Создать тему
Опции темы

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