Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,007
Записей в блоге: 1
1

Тест на знание Си

18.07.2023, 22:04. Показов 736. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте !

Учу Си по онлайн-курсу. Даны два следующих кода :

C Скопировано
1
2
3
4
5
6
7
#include <stdio.h>
void main(void)
{
    int x=1,y=0,z=5;
    int a=x && y || z++;
    printf(%d”,z);
}
Почему ответ тут равен 6 ?

C Скопировано
1
2
3
4
5
6
7
#include <stdio.h>
void main(void)
{
    int x=1,y=0,z=5;
    int a=x && y && z++;
    printf(%d”,z);
}
А здесь ответ почему равен 5 ?

Буду рад если обьясните...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.07.2023, 22:04
Ответы с готовыми решениями:

Тест на знание C++
Господин Usaga, у меня есть идея. Предлагаю оценить мои знания C++ в деле. Дайте мне какое-нибудь задание, которое сами можете выполнить за...

Тест на знание Delphi
На знание Delphi то есть мне нужны просто готовые вопросы с ответами чтобы вставить в компонент RadioGroup

Тест на знание php
Помогите решить пожалуйста два номера

9
 Аватар для Pphantom
1781 / 1242 / 619
Регистрация: 17.03.2022
Сообщений: 3,944
18.07.2023, 22:15 2
Лучший ответ Сообщение было отмечено Pphantom как решение

Решение

Ну очевидно, что в одном случае инкремент z срабатывает, в другом - нет.

А разница в том, что для вычисления значения первого логического выражения нужно выяснить, что находится в последней его части (x && y дают 0, результат определяется оставшейся частью), а во втором случае - нет, до инкремента дело просто не доходит.
1
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,007
Записей в блоге: 1
18.07.2023, 22:24  [ТС] 3
Pphantom, ок, для начала. Что имеет больший приоритет - операция ++ ? Или операции && и || ?

Добавлено через 2 минуты
Надеюсь, что && и || имеют одинаковый приоритет ?
0
 Аватар для Pphantom
1781 / 1242 / 619
Регистрация: 17.03.2022
Сообщений: 3,944
18.07.2023, 22:32 4
max_sk, а погуглить вы самостоятельно не можете?

Цитата Сообщение от max_sk Посмотреть сообщение
Что имеет больший приоритет - операция ++ ? Или операции && и || ?
Первая. И, что интересно, в данном случае эта информация вам совершенно не нужна.
Цитата Сообщение от max_sk Посмотреть сообщение
Надеюсь, что && и || имеют одинаковый приоритет ?
Нет. А вот тут перед изучением языка полезно немного изучить матлогику (ну или просто немного подумать, припомнив сведения из 2, кажется, класса школы).
1
92 / 19 / 4
Регистрация: 11.04.2015
Сообщений: 1,007
Записей в блоге: 1
19.07.2023, 19:11  [ТС] 5
Почитал тут статью Майкрософта на эту тему... То есть, если я правильно понимаю в выражении x && y || z++ x && y дают false ( логическое 0 ) и дальше 0 || z дают true, т.е. логическое 1 и поэтому выполняется z++, т.е. z становится равным 6.

В следующем коде дано выражение x && y && z++. X && y дает логическое 0 и далее 0 && z тоже дает логическое 0. И поэтому z++ не выполняется и z остается 5

Я прав ?

Тогда почему утверждается, что операция ++ имеет больший приоритет, чем && и ||, если сначала выполняются они ?
0
Заблокирован
19.07.2023, 19:19 6
Цитата Сообщение от max_sk Посмотреть сообщение
почему утверждается, что операция ++ имеет больший приоритет
Только в том случае, когда нужно выполнить эту операцию. Но если заведомо результат логической операции равен false, никаких дальнейших вычислений проводиться не будет: зачем?
Об этом всегда необходимо помнить, чтобы на "UB" не нарваться (которое на самом деле не UB, а косяк программиста).
1
 Аватар для Pphantom
1781 / 1242 / 619
Регистрация: 17.03.2022
Сообщений: 3,944
19.07.2023, 19:49 7
Цитата Сообщение от max_sk Посмотреть сообщение
Я прав ?
Да, только вам это уже в первом ответе было написано.
Цитата Сообщение от max_sk Посмотреть сообщение
Тогда почему утверждается, что операция ++ имеет больший приоритет, чем && и ||, если сначала выполняются они ?
Потому что это постинкремент, ключевая часть выделена жирным. Сначала используется значение, потом выполняется инкремент. Но если значение не используется...
1
Неэпический
 Аватар для Croessmah
18124 / 10709 / 2063
Регистрация: 27.09.2012
Сообщений: 26,998
Записей в блоге: 1
20.07.2023, 12:09 8
Цитата Сообщение от max_sk Посмотреть сообщение
Я прав ?
Тогда почему утверждается, что операция ++ имеет больший приоритет, чем && и ||, если сначала выполняются они ?
Это особенность операторов && и ||. Назовем её "ленивые вычисления" - если результат правой части ни на что повлиять не может, то вычисление и не выполняется.
Соответственно, для логического ИЛИ правая часть не имеет смысла, если левая равна TRUE - TRUE || (что угодно) всегда даст TRUE.
А для логического И правая часть не имеет смысла, если левая часть равна FALSE - FALSE && (что угодно) всегда даст FALSE.

Цитата Сообщение от Вырезка из стандарта по оператору ||
Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares unequal to 0, the second operand is not evaluated.
Цитата Сообщение от Вырезка из стандарта по оператору &&
Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares equal to 0, the second operand is not evaluated.
Рассмотрим:
x && y || z++;
x && y && z++;
при x=1,y=0,z=5;, тогда
x && y всегда дает FALSE (1 && 0 = 0), следовательно:
FALSE || z++;
FALSE && z++;
В первом случае, правая часть может повлиять на результат (левая часть равна 0), поэтому z++ вычисляется.
Во втором случае, правая часть не может повлиять на результат (левая часть равна 0), поэтому z++ не вычисляется.
0
 Аватар для Наталья8
479 / 345 / 64
Регистрация: 09.03.2016
Сообщений: 3,417
20.07.2023, 13:26 9
Когда то разбирался....
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
#include <iostream>
#include <conio.h>
using namespace std;
 
bool boo(){ cout << "boo() is  true" << endl; return true; }
//============================
bool doo(){ cout << "doo() is  false" << endl; return false; }
//============================
/* Первый ключ проверяет только первый оператор...
второй проверяет только первый оператора (условие не выполняеться)
третий проверяет оба оператора
*/
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    // Проверил первый и хуй с ним
    if (boo() || !doo())cout << "      == enter ==" << endl;
    cout << "========= \n" << endl;
    
    // Проверил первый и хуй с ним (не сработало)
    if (!boo() && !doo())cout << "      == enter ==" << endl;
    cout << "========= \n" << endl;
    
    // Проверил первый и второй (сработало)
    if (boo() && !doo())cout << "      == enter ==" << endl;
    cout << "========= \n" << endl;
 
    if ( (!boo() && !doo() ) || ( boo() && !doo()) )cout << "     == last_enter ==" << endl;
    cout << "========= \n" << endl;
 
    cout << "Hello world!" << endl;
    
    getchar();
    return 0;
}
Добавлено через 1 минуту
На плюсы похоже, да здесь ни чего особенного нет...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12860 / 6725 / 1808
Регистрация: 18.10.2014
Сообщений: 17,026
20.07.2023, 20:52 10
Цитата Сообщение от max_sk Посмотреть сообщение
Почитал тут статью Майкрософта на эту тему... То есть, если я правильно понимаю в выражении x && y || z++ x && y дают false ( логическое 0 ) и дальше 0 || z дают true, т.е. логическое 1 и поэтому выполняется z++, т.е. z становится равным 6.
Нет, не правильно. Ни о каком "дальше 0 || z дают true" речи не идет.

Значение имеет только то, что "x && y дают false". Это значит, что для того, чтобы вычислить ||, левой части недостаточно. Нужно вычислять правую часть, то есть z++. При этом и происходит увеличение z.

Цитата Сообщение от max_sk Посмотреть сообщение
В следующем коде дано выражение x && y && z++. X && y дает логическое 0 и далее 0 && z тоже дает логическое 0. И поэтому z++ не выполняется и z остается 5
Нет, опять же "далее 0 && z тоже дает логическое 0" здесь ни при чем. Значение имеет только то, что x && y дает 0. Это сразу означает, что все выражение дает 0. Вычислять последнюю часть, то есть z++, в такой ситуации не требуется (и не разрешается). Поэтому z не меняет значения.

Цитата Сообщение от max_sk Посмотреть сообщение
Тогда почему утверждается, что операция ++ имеет больший приоритет, чем && и ||, если сначала выполняются они ?
Приоритеты операций не имеют никакого отношения к порядку их выполнения. Приоритеты операций диктуют только способ синтаксического разбора выражения: какие операнды нужно отдать каким операторам. А на то, что выполнять "сначала", приоритеты операций никакого влияния не оказывают.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.07.2023, 20:52
Помогаю со студенческими работами здесь

Тест на знание ассемблера
Доброго времени суток, господа! В этом семестре нам преподавали системное программирование. Я немного не добрал до зачета и, чтобы...

Тест на знание Windows
Разработка гипертекстового документа &quot;Тест на знание Windows&quot;

Тест на знание предмета
Задали тест. Нужна помощь с одной функцией теста. Вообщем необходимо сделать так, чтобы при вводе числа в диапазоне от 1 до 50, выдавал...

Пройдите тест на знание ATmega
Я тут сделал тест на знание микроконтроллеров серии ATmega. Если точнее, то программирование МК на языке C. 10 вопросов разной степени...

Программа тест на знание Си++ не работает
Добрый вечер. Написал 1ю версию программы &quot;Система тестирования&quot; и добавил несколько вопросов (5 вопросов). Но почему то при запуске ничего...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Осваиваем Kubernetes: Подробная шпаргалка
Mr. Docker 15.03.2025
Kubernetes — это открытая платформа для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Он был создан для решения проблем, с которыми сталкиваются. . .
Лучшие PHP REST API фреймворки
Jason-Webb 15.03.2025
Современные PHP REST API фреймворки предлагают большой набор функциональности: от автоматической валидации данных и управления маршрутизацией до генерации документации и интеграции с различными. . .
Многопоточность в Java с Project Loom: виртуальные или обычные потоки
Javaican 15.03.2025
Многопоточность всегда была одноим из основных элементов в разработке современного программного обеспечения. Она позволяет приложениям обрабатывать несколько задач одновременно, что критично для. . .
Что нового в Swift 6 и особенности миграции
mobDevWorks 15.03.2025
Swift 6 — это новый крупный релиз языка программирования от Apple, анонсированный на WWDC 2024. Если вы следили за эволюцией Swift, то наверняка заметили, что многие значимые возможности, которые. . .
Вопросы на собеседовании по Android
mobDevWorks 14.03.2025
По данным статистики, Android занимает более 70% мирового рынка мобильных операционных систем, что делает платформу привлекательной как для начинающих разработчиков, так и для опытных профессионалов. . . .
Лучшие игровые движки для Python
py-thonny 14.03.2025
Python обеспечивает разработчиков игр мощными движками и фреймворками, которые позволяют воплотить практически любую идею — от простой аркады до визуального романа с разветвленным сюжетом. Главное. . .
Бессерверный JavaScript: Разработка масштабируемых API с AWS Lambda
run.dev 14.03.2025
Но что такое бессерверные вычисления на самом деле? По сути, это модель облачных вычислений, где разработчик фокусируется исключительно на создании бизнес-логики, не тратя время на настройку. . .
Безопасность кода в C++26: Менеджеры ресурсов и висячие ссылки
NullReferenced 14.03.2025
C++ всегда был языком, предоставляющим разработчикам большие возможности и гибкость, но вместе с тем требующим ответственности. Одной из самых коварных проблем даже для опытных программистов остаются. . .
smart-agent proper interface settings (2025)
jigi33 14.03.2025
Smart-agent proper interface settings (mart 2025). (see screenshots to look at "Etalon" ARM)
Продвинутые настройки JVM
Javaican 14.03.2025
Стандартные параметры запуска JVM хороши для повседневной разработки, но совершенно недостаточны для высоконагруженных систем. Представьте, что вы запускаете финансовую платформу, обрабатывающую. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер