Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2015, 00:26   #1
Pug_from_Mordor
Пользователь
 
Аватар для Pug_from_Mordor
 
Регистрация: 09.11.2014
Сообщений: 40
Сообщение Помогите разобраться с вопросом по СИ.

Сегодня на тесте попался вопрос:
Сколько раз выполнится цикл?
char i='0';
while(i<255)
printf("i=%d", i++);

Я вбил в компилятор и увидел, что ни разу. Но почему? Разве символьные переменные не должны преобразовываться к целочисленным в выражении с другой переменной типа int?
Pug_from_Mordor вне форума Ответить с цитированием
Старый 07.01.2015, 03:43   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Бесконечное количество раз, так как char при переполнении преобразуется в word, поэтому условие остановки цикла никогда не выполняется, так как signed char доходит только до 127 и никогда не доходит до 255. чтобы дошел до 255 должен быть unsigned char. char при объявлении значит знаковый char. то есть один бит уходит на знак а оставшиеся 7 бит на число, а всего в char 8 бит
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 07.01.2015, 10:04   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я вбил в компилятор и увидел, что ни разу.
GCC выполняет бесконечно. Что у тебя за компилятор?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2015, 10:56   #4
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

Цитата:
char i='0';
while(i<255)
printf("i=%d", i++);
Borland C++
Если:
char i = '0'
то цикл бесконечный.
Если:
unsigned char i = '0'
то цикл выполнится 207 раз.
Цитата:
Разве символьные переменные не должны преобразовываться к целочисленным в выражении с другой переменной типа int?
Должны, но символ '0' равен 48, поэтому если вы хотите '5' + 5 получить 10, надо:
Код:
int x = ('5' - '0') + 5
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 07.01.2015, 16:11   #5
Pug_from_Mordor
Пользователь
 
Аватар для Pug_from_Mordor
 
Регистрация: 09.11.2014
Сообщений: 40
Сообщение

Цитата:
Сообщение от Stilet Посмотреть сообщение
GCC выполняет бесконечно. Что у тебя за компилятор?
Pelles C for Windows
Pug_from_Mordor вне форума Ответить с цитированием
Старый 07.01.2015, 16:21   #6
Pug_from_Mordor
Пользователь
 
Аватар для Pug_from_Mordor
 
Регистрация: 09.11.2014
Сообщений: 40
По умолчанию

Только что зашёл на ideone.com и прокомпилировал там. Цикл выполняется бесконечно. Тут видимо 2 случая: либо Pelles С ни разу не выполнил цикл, так как посчитал, что условие неверно; либо он понял, что цикл будет выполняться бесконечно, пропустил его и забил на сообщение об этом пользователю. Я немного изменил код:
#include <stdio.h>
int main(void)
{
char i='0';
while(i<255)
printf("lolka");
i++;
return 0;
}
При компиляции компилятор выдал мне: warning #2154: Unreachable code.
То есть Pelles C действительно считает условие неверным, в то время как ideone.com считает его верным, но бесконечным. Ну вот и допустим будет у меня в тесте 2 варианта ответа: 1.Цикл не выполнится ни разу; 2.Цикл будет выполнятся бесконечно. И какой из них изволите выбирать, разработчики?

Последний раз редактировалось Pug_from_Mordor; 07.01.2015 в 16:29.
Pug_from_Mordor вне форума Ответить с цитированием
Старый 07.01.2015, 17:20   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Pelles C действительно считает условие неверным
Просто там оптимизация включена. Я думаю что в любом компиляторе можно поиграться с настройками и довести его до Unreachable code дэтэктэд.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2015, 22:35   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Я думаю что в любом компиляторе можно поиграться с настройками и довести его до Unreachable code дэтэктэд.
Может просто включить вывод варнингов или начать их читать?.. Все компиляторы (даже для микроконтроллеров), установленные у меня, предупредили - "а не дурак ли ты программист?"
p51x вне форума Ответить с цитированием
Старый 08.01.2015, 08:00   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Может просто включить вывод варнингов или начать их читать?
Кто же будет читать варнинги, если программа шустро запустилась и перекрыла окно самого компиля?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста с одним вопросом ! Анонимщик Помощь студентам 0 08.02.2014 23:06
помогите с простым вопросом Тарабаровъ Microsoft Office Access 7 30.12.2009 20:12
помогите с вопросом darika Паскаль, Turbo Pascal, PascalABC.NET 11 07.07.2009 16:34
Помогите с легким вопросом! (assembler) NeXor Помощь студентам 3 27.01.2009 13:18
Помогите с вопросом на C/C++ dilik Общие вопросы C/C++ 1 07.01.2009 17:42