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

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

18.07.2023, 22:04. Показов 744. Ответов 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
1789 / 1248 / 621
Регистрация: 17.03.2022
Сообщений: 3,957
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
1789 / 1248 / 621
Регистрация: 17.03.2022
Сообщений: 3,957
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
1789 / 1248 / 621
Регистрация: 17.03.2022
Сообщений: 3,957
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
481 / 347 / 64
Регистрация: 09.03.2016
Сообщений: 3,436
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
12866 / 6731 / 1809
Регистрация: 18.10.2014
Сообщений: 17,035
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
Ответ Создать тему
Новые блоги и статьи
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
Предсказание ветвлений - путь к высокопроизводи­тельному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
Создаем микросервисы с NestJS, TCP и Typescript
run.dev 17.03.2025
NestJS — фреймворк, который значительно упрощает создание серверных приложений на Node. js. Его прелесть в том, что он комбинирует концепции ООП, функционального программирования и предлагает. . .
Гексагональная архитектура со Spring Boot
Javaican 17.03.2025
Если вы когда-нибудь сталкивались с ситуацией, когда внесение простых изменений в базу данных или пользовательский интерфейс заставляло вас переписывать весь код, то вы точно оцените элегантность. . .
Позиционировани­е Kafka Consumer и Seek-операции
Javaican 17.03.2025
Что же такое Consumer Seek в Kafka? По сути, это API-метод, который позволяет программно указать, с какой позиции (offset) Consumer должен начать или продолжить чтение данных из партиции. Без этого. . .
Python NumPy: Лучшие практики и примеры
py-thonny 17.03.2025
NumPy (Numerical Python) — одна из ключевых библиотек для научных вычислений в Python. Она превращает Python из просто удобного языка общего назначения в среду для проведения сложных математических. . .
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер