Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 09.01.2012
Сообщений: 7
1

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

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

Author24 — интернет-сервис помощи студентам
Народ!
Операция сравнения возвращает ЧИСЛО, т.е. 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.01.2012, 19:18
Ответы с готовыми решениями:

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

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

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

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

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

А сам по себе if ничего не возвращает. С какой радости у вас while(if(3)) должно отработать?
0
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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.01.2012, 19:43 5
Цитата Сообщение от TamTam Посмотреть сообщение
После ифа должно быть выражение, истиность или ложность которого оно возвращает
Куда оно возвращает?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.01.2012, 19:45 6
1) Оператор if ничего не возвращает, он всего лишь проверяет истинность условия.
2) Достаточно открыть любую книгу по ассемблеру и прочитать про команды условного перехода.
0
18 / 18 / 2
Регистрация: 28.12.2011
Сообщений: 176
10.01.2012, 19:47 7
проверяет, проверяет. не возвращает
0
1 / 1 / 0
Регистрация: 09.01.2012
Сообщений: 7
10.01.2012, 19:49  [ТС] 8
Да, спасибо. Третий пункт мой затуп. Можно теперь про if конкретно инфу получить?
0
18 / 18 / 2
Регистрация: 28.12.2011
Сообщений: 176
10.01.2012, 19:57 9
if ( выражение )
оператор_1;
else
оператор_2;


часть else может и отсутствовать. Сначала вычисляется "выражение" в скобках; если оно истинно то выполняется оператор_1. Если "выражение" ложно, то оператор_1 пропускается, а выполняется оператор_2. Если на месте условно выполняемых операторов должна располагаться группа из нескольких операторов языка, то они заключаются в фигурные скобки - { }.
0
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
36 / 36 / 1
Регистрация: 12.10.2011
Сообщений: 333
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
2554 / 1319 / 178
Регистрация: 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
18 / 18 / 2
Регистрация: 28.12.2011
Сообщений: 176
10.01.2012, 20:52 13
экий вы въедливый) Дело в том, что язык си - это не машинный язык. Перед тем, как комп что-либо поймет все это ему переведут.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 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
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
10.01.2012, 21:19 15
soon,

Не по теме:

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

0
32 / 32 / 4
Регистрация: 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
2554 / 1319 / 178
Регистрация: 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
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
10.01.2012, 21:29 18
Цитата Сообщение от Whiteha Посмотреть сообщение
soon,

Не по теме:

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

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

Не по теме:

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

0
10.01.2012, 21:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2012, 21:34
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru