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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
#1

Pseudo_Game - C++

15.08.2010, 11:52. Просмотров 2200. Ответов 40
Метки нет (Все метки)

Привет народ. Я со вчерашнего дня начал изучать C++ (после нескольких месяцем занятий BASICом),
имею такую задачку:
При нажатии esc вывести на экран значение x, и только после этого чтоб можно было закрыть
консоль нажатием любой клавиши.
Я никак не пойму почему оператор switch выполняется когда ChkExit = 0, а else не выполняется.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <conio.h>
#include <clocale>
 
using namespace std;
 
int main()
{
    char act;
int ch;
int x = 0; int y = 0;
bool ChkExit = 1;
 
setlocale(LC_CTYPE,"Russian");
    
while(1)
{
act = _getch();
ch = static_cast<int>(act);
if(ChkExit = 1)
{
    switch(ch)
    {
        case -32:
            break;
 
        case 27:
            ChkExit = 0;
            cout << "ChkExit = " << ChkExit << "\n";
            cout << " x = " << x << "\n";
            //exit(0);
            break;
 
        case 77:
            cout << "Направо.\n";
            x += 1;
            break;
 
        default:
            cout << "Не та клавиша.\n";
    }
  }
else if(ChkExit = 0)
cout << "y = " << y << "\n";
}
    
}
Помогите пожалуйста чайнику.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.08.2010, 07:13     Pseudo_Game #21
alexzak, Нормально - не значит правильно. Нормально - значит жуется компилятором.
А вот возвращать ноль - это правильно. Не возвращать это нормально. Но не правильно. int функции обязаны возвращать значение. Почему бы не написать одну строку кода лишнюю, чтобы было ПРАВИЛЬНО?
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 07:18     Pseudo_Game #22
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Нормально - не значит правильно. Нормально - значит жуется компилятором.
А вот возвращать ноль - это правильно. Не возвращать это нормально. Но не правильно. int функции обязаны возвращать значение. Почему бы не написать одну строку кода лишнюю, чтобы было ПРАВИЛЬНО?
Делай "правильно", кто тебе мешает. Только твои критерии правильности немного не соответствуют действительности.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.08.2010, 07:19     Pseudo_Game #23
alexzak, Большинство программистов возвращают ноль из main. Большинство мировых специалистов советует возвращать ноль, говоря, что это правильно. Вам мало?
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 07:21     Pseudo_Game #24
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Большинство людей возвращают ноль из main. Большинство мировых специалистов советует возвращать ноль, говоря, что это правильно. Вам мало?
Безосновательное заявление. Где факты?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.08.2010, 07:30     Pseudo_Game #25
alexzak, Цитата из Шилдта:
На практике многие компиляторы языка С/С++ по умолчанию возвращают число 0, но полагаться на это не стоит, поскольку это снизит машинонезависимость вашей программы.
Страуструп:

Целое значение, возвращаемое main(), если оно вообще возвращается предназначается "для системы". Если не возвращается никакого значения, система получает значение, означающее успешное завершение.
И оба они пишут программы в своих книгах с return 0 в конце. Если бы этого не было нужно - не писали бы наверное. Так что это верно.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 07:42     Pseudo_Game #26
Шилдт просто балбес, мы его пропустим. У него много чего просто неправильно, начиная от мелких опечаток, кончая дизинформацией. А Страуструп правильно пишет, "Если не возвращается никакого значения, система получает значение, означающее успешное завершение." О чем я тебе и говорил. У него же самая первая программа в книге:
Код
#include <iostream>
int main()
{
    std::cout << "Hello, new world!\n";
}
return 0 в конце main у него нигде в книге не встречается. Может ты и Страуструпа не читал? Можешь не отвечать. Вопрос риторический.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.08.2010, 07:49     Pseudo_Game #27
alexzak, Не читал. Читаю. Однако, про Шилдта слишком резко. Он вполне себе признанный специалист, а так же был членом комитета. Так что пропускать Шилдта не стоит
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 07:54     Pseudo_Game #28
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Не читал. Читаю. Однако, про Шилдта слишком резко. Он вполне себе признанный специалист, а так же был членом комитета. Так что пропускать Шилдта не стоит
С твоим знанием С++ тебе будет трудно найти у Шилдта ошибки и просто неверную информацию. Но поверь экспертам, которые не рекомендуют его книги к прочтению. Зайди на этот сайт:
http://accu.org/index.php?module=boo...ws&func=search
и сделай поиск по автору "Schildt". Можешь и обзоры почитать, если английский позволяет.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.08.2010, 09:01     Pseudo_Game #29
alexzak, Возможно. Но мои знания С++ достаточные для полугода или чуть более изучения. И я привык возвращать 0 явно. На этом можно прекратить дискуссию.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
18.08.2010, 09:14     Pseudo_Game #30
Цитата Сообщение от Lavroff Посмотреть сообщение
alexzak, Возможно. Но мои знания С++ достаточные для полугода или чуть более изучения. И я привык возвращать 0 явно. На этом можно прекратить дискуссию.
Понятно. Когда знаний немного, они представляются в форме абсолютных истин. Но с опытом это проходит.
ForEveR
18.08.2010, 09:22
  #31

Не по теме:

alexzak, Я сказал для того, сколько я изучаю. Основу знаю в некоторой степени. Не было участия в серьезных проектах - следовательно опыта нет. Ну да ничего. Все впереди

easybudda
Эксперт С++
9455 / 5468 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
18.08.2010, 11:18     Pseudo_Game #32
Цитата Сообщение от Lavroff Посмотреть сообщение
пишите void main().
Вот так точно лучше никогда не делать! А в остальном - если в конце main() не поставить return 0 - компилятор должен бы сам это сделать. В первых 1 1/2 главах КиР тоже return в конце main не ставили, но в главе 1.7 "Функции" они же пишут:
Поскольку main есть функция, как и любая другая она может вернуть результирующее значение тому, кто её вызвал - фактически в ту среду, из которой была запущена программа. Обычно возвращается нулевое значение, что говорит о нормальном завершении выполнения. Ненулевое значение сигнализирует о необычном или ошибочном завершении. До сих пор ради простоты мы опускали return в main, но с этого момента будем задавать return как напоминание о том, что программы должны сообщать о состоянии своего завершения в операционную систему.
Так, что, я тоже за return в main.
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
18.08.2010, 20:04  [ТС]     Pseudo_Game #33
Шилдт просто балбес, мы его пропустим. У него много чего просто неправильно, начиная от мелких опечаток, кончая дизинформацией.
Я по Шилдтсу C# изучаю.200 страниц из почти 1000.Скучновато конечно.Вот по C++ прикольный онлайн учебник нашел, не оторваться от компа,но он ориентирован на создание игр.http://shatalov.su/cpp_primer/
Изучаю параллельно C# и C++.Одно другому скорее помогает.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
19.08.2010, 06:49     Pseudo_Game #34
Цитата Сообщение от easybudda Посмотреть сообщение
Вот так точно лучше никогда не делать! А в остальном - если в конце main() не поставить return 0 - компилятор должен бы сам это сделать. В первых 1 1/2 главах КиР тоже return в конце main не ставили, но в главе 1.7 "Функции" они же пишут:
Так, что, я тоже за return в main.
Мало того, что K&R никакого отношения к С++ не имеет, эта книга была написана до стардарта С90. И как только стандарт вышел, она потеряла значимость как справочник и руководство по С. Т.е. и к современному С она имеет очень слабое отношение. (хотя читать её еще интересно)

Ты хоть обрати внимание, как там main объявляется. Просто как 'main()'. Никаких тебе типа возвращаемого значения, ни void в параметрах, ничего.

Так как вам здесь больше никто не расскажет, а сами вы и не прочитаете нигде, я вам покажу, как должна выглядеть main в С:
Код
int main(void);
int main(int argc, char *argv[]);
А последний стандарт С99 позволяет не писать явного return 0; в конце main так же как и в C++.

Ничего нет плохого в том, чтобы возвращать 0 явно. Но все ваши источники информации, которыми вы пытаетесь аргументировать свой выбор, либо устарели, либо просто очень низкого качества.
easybudda
Эксперт С++
9455 / 5468 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.08.2010, 10:34     Pseudo_Game #35
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от alexzak Посмотреть сообщение
Ты хоть обрати внимание, как там main объявляется. Просто как 'main()'.
Я Вас видимо удивлю, но в С функция, объявленная без указания типа возвращаемого значения, возвращает тип int.
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
sum(int a, int b){
    return a + b;
}
 
main(){
    int a = 2;
    int b = 2;
    printf("%d + %d = %d\n", a, b, sum(a, b));
}

Не по теме:

Цитата Сообщение от alexzak Посмотреть сообщение
Так как вам здесь больше никто не расскажет, а сами вы и не прочитаете нигде, я вам покажу, как должна выглядеть main в С:
Спасибо Вам за то, что Вы есть!

alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
19.08.2010, 10:46     Pseudo_Game #36
Цитата Сообщение от easybudda Посмотреть сообщение
Я Вас видимо удивлю, но в С функция, объявленная без указания типа возвращаемого значения, возвращает тип int.
Знаток ты наш, если по Кернигану учиться, то и дальше так будешь думать. Рекомендую самому для самообразования найти в С99 текст, запрещающий неявный int.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.08.2010, 11:01     Pseudo_Game #37
Цитата Сообщение от alexzak Посмотреть сообщение
Рекомендую самому для самообразования найти в С99 текст, запрещающий неявный int.
Покажите мне компилятор, который полностью поддерживает С99.
easybudda
Эксперт С++
9455 / 5468 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.08.2010, 11:13     Pseudo_Game #38
Цитата Сообщение от alexzak Посмотреть сообщение
Знаток ты наш, если по Кернигану учиться, то и дальше так будешь думать. Рекомендую самому для самообразования найти в С99 текст, запрещающий неявный int.
Не поверишь - я в курсе. Тем не менее стандарт ANSI C 89 так своей актуальности и не утратил. ANSI С 99 - это, конечно, хорошо, и многое, добавленное в нём, действительно полезно, но вот незадача - поддерживается только компиляторами gcc (вроде бы в MSVS 2010 собирались поддерживать). Код же, соответствующий стандарту ANSI C 89 с одинаковым успехом должен компилироваться любым компилятором.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
20.08.2010, 08:15     Pseudo_Game #39
Цитата Сообщение от easybudda Посмотреть сообщение
Не поверишь - я в курсе. Тем не менее стандарт ANSI C 89 так своей актуальности и не утратил. ANSI С 99 - это, конечно, хорошо, и многое, добавленное в нём, действительно полезно, но вот незадача - поддерживается только компиляторами gcc (вроде бы в MSVS 2010 собирались поддерживать). Код же, соответствующий стандарту ANSI C 89 с одинаковым успехом должен компилироваться любым компилятором.
MSVC в какой-то мере поддерживает C99 при компиляции С кода в режиме C++.

То, что старый код компилируется, хрен с ним. Но как только выходит новый стандарт предыдущий считается устаревшим, и плодить код (а также его оправдывать), в соответствии с правилами устаревшего C89, такими как неявный int, это по меньшей мере глупо.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.08.2010, 08:18     Pseudo_Game #40
Цитата Сообщение от alexzak Посмотреть сообщение
MSVC в какой-то мере поддерживает C99 при компиляции С кода в режиме C++.
простите
Цитата Сообщение от alexzak Посмотреть сообщение
Но как только выходит новый стандарт предыдущий считается устаревшим, и плодить код (а также его оправдывать), в соответствии с правилами устаревшего C89, такими как неявный int, это по меньшей мере глупо.
А вы предлагаете писать код в соответствии с новым стандартом, компилировать С++ компилятором, и получать совершенну другую программу только ради нового стандарта?
Yandex
Объявления
20.08.2010, 08:18     Pseudo_Game
Ответ Создать тему
Опции темы

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