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

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

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

Pseudo_Game - C++

15.08.2010, 11:52. Просмотров 2251. Ответов 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";
}
    
}
Помогите пожалуйста чайнику.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
18.08.2010, 09:22     Pseudo_Game
  #31

Не по теме:

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

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

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

То, что старый код компилируется, хрен с ним. Но как только выходит новый стандарт предыдущий считается устаревшим, и плодить код (а также его оправдывать), в соответствии с правилами устаревшего C89, такими как неявный int, это по меньшей мере глупо.
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.08.2010, 08:18 #40
Цитата Сообщение от alexzak Посмотреть сообщение
MSVC в какой-то мере поддерживает C99 при компиляции С кода в режиме C++.
простите
Цитата Сообщение от alexzak Посмотреть сообщение
Но как только выходит новый стандарт предыдущий считается устаревшим, и плодить код (а также его оправдывать), в соответствии с правилами устаревшего C89, такими как неявный int, это по меньшей мере глупо.
А вы предлагаете писать код в соответствии с новым стандартом, компилировать С++ компилятором, и получать совершенну другую программу только ради нового стандарта?
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
20.08.2010, 10:53 #41
Цитата Сообщение от alexzak Посмотреть сообщение
Но как только выходит новый стандарт предыдущий считается устаревшим, и плодить код (а также его оправдывать), в соответствии с правилами устаревшего C89, такими как неявный int, это по меньшей мере глупо.
Пользоваться такими вещами, как неявное назначение типа int, по-моему вообще незачем. Верный путь к трудноуловимым ошибкам, видимо по этому в С99 и убрали это правило. Суть не в этом. Разговор был о возвращаемом значении или его отсутствии. К этому и было сказано, что в С функция вида
C
1
main(){ printf("Hello!\n"); }
на самом деле имеет тип int и возвращает 0.
0
Yandex
Объявления
20.08.2010, 10:53
Ответ Создать тему
Опции темы

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