Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
csrnsdrfg
1 / 1 / 0
Регистрация: 09.01.2012
Сообщений: 7
#1

Как работает оператор if?

10.01.2012, 19:18. Просмотров 3223. Ответов 22
Метки нет (Все метки)

Народ!
Операция сравнения возвращает ЧИСЛО, т.е. while и if принимают ЧИСЛО (0 - false, etc - true).
Вопрос 1) Почему нельзя записать так:
while ( if (3) );
Я этим хочу сказать следующее:
1) Проверяем истинность выражения в скобках while
2) Натыкаемся на if, проверяем истинность (ведь, я если б я туда поставил выражение: "5+3", он бы сначала посчитал его, потом сравнил)
3) if Возвращает true (3 - true)
4) Выражение в скобках while - true. Начинаем цикл
5) Тело цикла - пустой оператор. Возвращаемся к началу.
Вопрос 2) Как устроен оператор if? Прошу серьезно отнестись к вопросу. Ответы типа: "проверяет истинность. Возвращает число" и т.п. не принимаются.
Хочу услышать разумный ответ. Комп не понимает операции "проверить истинность". КАК ПРОИСХОДИТ эта самая проверка? Желательно максимально подробно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2012, 19:18
Ответы с готовыми решениями:

Как работает оператор new?
Обязательно ли использовать оператор delete в коде (см.ниже.).После...

Как работает оператор typedef
как работает оператор typedef если есть у кого сам код то пришлите,интересно:)

Как работает оператор char *?
Как работает оператор char *! Можете описать его принцип работы! Спасибо...

Как работает тернарный оператор
Здравствуйте. Объясните, пожалуйста, что значит эта строка color = (color ==...

Как работает оператор switch?
Shape* generator() { switch(rand() % 3) { case 0: return new Triangle; case...

22
DebieCooper
34 / 34 / 1
Регистрация: 12.10.2011
Сообщений: 301
10.01.2012, 19:34 #2
А в чём проблема?
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.01.2012, 19:37 #3
Потому, что if() без тела не отработает.
Точнее отработает, но вот так "if(3);", что никакой смысловой нагрузки не несет.

А сам по себе if ничего не возвращает. С какой радости у вас while(if(3)) должно отработать?
0
TamTam
18 / 18 / 2
Регистрация: 28.12.2011
Сообщений: 176
10.01.2012, 19:41 #4
А что, если вы писали 5+3, то работало?)

После ифа должно быть выражение, истиность или ложность которого оно возвращает. если гдето раньше 3 присвоили true (хотя так вроде нельзя), то должно быть напр 3 = true, ну или 3 = 3.

А 0 - false это общее обозначение. Так можно в алгоритмах писать, и может на ассемблерах каких.

И где это у нас etc - true, никогда не встречалось, только 1 - true (система то двоичная, ничего другого и нет)
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.01.2012, 19:43 #5
Цитата Сообщение от TamTam Посмотреть сообщение
После ифа должно быть выражение, истиность или ложность которого оно возвращает
Куда оно возвращает?
0
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
10.01.2012, 19:45 #6
1) Оператор if ничего не возвращает, он всего лишь проверяет истинность условия.
2) Достаточно открыть любую книгу по ассемблеру и прочитать про команды условного перехода.
0
TamTam
18 / 18 / 2
Регистрация: 28.12.2011
Сообщений: 176
10.01.2012, 19:47 #7
проверяет, проверяет. не возвращает
0
csrnsdrfg
1 / 1 / 0
Регистрация: 09.01.2012
Сообщений: 7
10.01.2012, 19:49  [ТС] #8
Да, спасибо. Третий пункт мой затуп. Можно теперь про if конкретно инфу получить?
0
TamTam
18 / 18 / 2
Регистрация: 28.12.2011
Сообщений: 176
10.01.2012, 19:57 #9
if ( выражение )
оператор_1;
else
оператор_2;


часть else может и отсутствовать. Сначала вычисляется "выражение" в скобках; если оно истинно то выполняется оператор_1. Если "выражение" ложно, то оператор_1 пропускается, а выполняется оператор_2. Если на месте условно выполняемых операторов должна располагаться группа из нескольких операторов языка, то они заключаются в фигурные скобки - { }.
0
csrnsdrfg
1 / 1 / 0
Регистрация: 09.01.2012
Сообщений: 7
10.01.2012, 20:02  [ТС] #10
TamTam, я это все знаю.
Ты мне лучше скажи, как просходит само определение истинности? Как комп понимает, что !(PI>8.35) - true??????

Добавлено через 2 минуты
По теме еще один вопрос...
Почему нельзя писать так: while (ch = getchar != EOF) ...

Операция сравнения имеет больший приоретет, чем присваивание. Я понимаю, что этим хитрожопно присваиваю значение 1 (в случае getchar () != [ctrl +z]) или 0 (в остальных случаях). Но все-таки, почему компилятор распознает это как ошибку?
0
DebieCooper
34 / 34 / 1
Регистрация: 12.10.2011
Сообщений: 301
10.01.2012, 20:03 #11
Полная форма предложения if выглядит так:
if(выражение) предложение;
else предложение;

Общая форма с использованием блоков выглядит так:
if(выражение)
{
последовательность предложений
}
else
{
последовательность предложений
}

Простой пример. Знаменитая программа "Магическое число"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <csdlib>
using namespace std;
 
int main()
{
    int magic; // магическое число
    int guess; // догадка пользователя
 
    magic = rand(); // полчим случайное число
 
    cout << "Вводите вашу догадку: ";
    cin >> guess;
 
    if(guess == magic) cout << "** Правильно **";
 
    return 0;
}
Надеюсь чем-нибудь помог вам.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.01.2012, 20:09 #12
К словам rangerx, код
cpp
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    int a = 5;
    if(a > 0)
        std::cout << "positive" << std::endl;
    else
        std::cout << "negative" << std::endl;
}
и куски из
asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
.LC0:
    .string "positive"
.LC1:
    .string "negative"
;...
    movl    $5, 28(%esp)
    cmpl    $0, 28(%esp)
    jle .L2
    movl    $.LC0, 4(%esp)
;...
.L2:
    movl    $.LC1, 4(%esp)
;...
Как комп понимает, что !(PI>8.35) - true??????
Он просто сравнивает 2 числа и в зависимости от результата либо "прыгает" по метке, либо нет.

Добавлено через 5 минут
Цитата Сообщение от csrnsdrfg Посмотреть сообщение
while (ch = getchar != EOF)
Может не getchar а getchar() все-таки?
1
TamTam
18 / 18 / 2
Регистрация: 28.12.2011
Сообщений: 176
10.01.2012, 20:52 #13
экий вы въедливый) Дело в том, что язык си - это не машинный язык. Перед тем, как комп что-либо поймет все это ему переведут.
0
BRcr
4015 / 2305 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
10.01.2012, 21:03 #14
Цитата Сообщение от csrnsdrfg Посмотреть сообщение
Почему нельзя писать так: while (ch = getchar != EOF) ...
Еще как можно
Просто правильно писать надо, а сообщениям компилятора внимать и делать выводы...
C++
1
2
3
4
5
bool ch;
while( ch = ( getchar( ) != EOF ) ){
  if( ch ) cout<< "true";
  else cout<< "false";
}
0
Whiteha
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
10.01.2012, 21:19 #15
soon,

Не по теме:

Можете подсказать как/чем вы вытаскиваете asm-код?

0
kisssko
31 / 31 / 3
Регистрация: 19.12.2011
Сообщений: 72
10.01.2012, 21:26 #16
csrnsdrfg, для начала следует учесть, что тернарный оператор ?: есть полный аналог конструкции if()else. Они полностью взаимозаменяемы. Вот теперь делаем выводы, что такое if.

if возвращает значение последнего выражения тела после if, либо после else, но никак не условие.

Добавлено через 3 минуты
Цитата Сообщение от soon Посмотреть сообщение
if(a > 0)
std::cout << "positive" << std::endl;
else std::cout << "negative" << std::endl;
А как давно ноль стал отрицательным числом?
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.01.2012, 21:28 #17
Whiteha,
так
Bash
1
2
3
4
g++ main.cpp -o main.s -S
#Или
gcc main.c -o main.s -S
#~В зависимости от языка
1
kisssko
31 / 31 / 3
Регистрация: 19.12.2011
Сообщений: 72
10.01.2012, 21:29 #18
Цитата Сообщение от Whiteha Посмотреть сообщение
soon,

Не по теме:

Можете подсказать как/чем вы вытаскиваете asm-код?

Отладчик в IDE. Visual Studio пользовались?
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.01.2012, 21:31 #19
kisssko, никогда не был им. Ну, 0 никогда не был отрицательным. На скорую руку накидал. Суть то была показать, какой код получится в результате преобразования Си кода в asm, а именно работу команд j--.
0
kisssko
31 / 31 / 3
Регистрация: 19.12.2011
Сообщений: 72
10.01.2012, 21:34 #20
soon,

Не по теме:

Ну ничего, бывает...

0
10.01.2012, 21:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2012, 21:34

Как работает оператор cout и return?
Допустим есть функция: int show() { int g = 5; cout &lt;&lt;...

Как работает оператор new, он же _Znwj на асме
Собственно как действительно он работает? То есть что реально происходит какие...

Уточнение о том как работает оператор for
Я правильно понимаю? Оператор for, сперва будет работать только с первым...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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