powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос про приоритеты операций
25 сообщений из 63, страница 1 из 3
вопрос про приоритеты операций
    #39773672
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>

int a = 1;
int b = 1;
int c = 1;

int main()
{
    a = (a++)*(-1);
    b = (b+1)*(-1);
    c = -(c++);

    printf("%i ", a);
    printf("%i ", b);
    printf("%i ", c);

    return 0;
}



так как я явно задал приоритеты скобками, то ожидаю от компилятора разворачивание в вид

a = (a+1) * (-1);
b = (b+1) * (-1);
c = (c+1) * (-1);

соответственно ожидаю и ответы -2 для a, b, c.

однако компилятор gcc выдает -1-2-1

а компилятор vc++ вообще выдал 0 -2 0

-----------

можете объяснить?
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773684
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UB
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773685
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
про ПРЕ и ПОСТ я в курсе.
но я явно задаю порядок.

и почему разные компиляторы вычисляют по разному?
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773686
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNose,

Приоритет ни причем
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773758
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNose,

каждый по своему прав
авторПри использовании операции постинкремента значение переменной сначала используется в выражении, а потом увеличивается на 1студия думает, что выражение это вся строка
гнус думает, что выражение ограничено скобками
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773768
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если убрать из кода пост-инкремент то появится хоть какой-то детерминизм.

А без этого выражение - ребус.
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773793
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z = (a++)*(-1) это не то же самое что z = (a+1)*(-1), это скорее z = (a)*(-1); a += 1

возможно речь шла про z = (++a)*(-1), тут должно быть -2

Интересно что код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	int a = 1;
		int b = 1;
		int c = 1;

		//int d = (a++)*(-1);

		a = (a++)*(-1);
		b = (b+1)*(-1);
		c = -(c++);



зависит от комментированной строки. Я такое уже как-то встречал, например
Код: plaintext
1.
2.
3.
4.
5.
A = 2;
A = 3;
if (0){
};
B = A;



Если убрать if, то результат будет другим нежели с if(0) =)
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773828
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseпро ПРЕ и ПОСТ я в курсе.
но я явно задаю порядок.

и почему разные компиляторы вычисляют по разному?
Потому что UB

a++ это не a+1, это означает при следующем чтении a будет больше на 1, а где произойдет сохранение увеличенного значения в a (по закрывающей скобке или по точке с запятой) остается на усмотрение компилятора.
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773833
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не согласен, что это UB.

Gcc прав.

с = *pc++ - классика
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773836
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UB это когда _один объект_ модифицируется _дважды_ в точке следования.
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773838
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglUB это когда _один объект_ модифицируется _дважды_ в точке следования.
У него дважды "a =" и "a++"
Код: plaintext
1.
a = (a++)*(-1);
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773841
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

точно, присваивание то я и не заметил )

Но это не то, что спрашивал топик, на самом деле правильный пример для его вопроса, чтобы не влияло от скобочек =)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <stdio.h>

int a = 1, a1;
int b = 1, b1;
int c = 1, c1;

int main()
{
	a1 = (a++)*(-1);
	b1 = (b + 1)*(-1);
	c1 = -(c++);

	printf("%i ", a1);
	printf("%i ", b1);
	printf("%i ", c1);

	getchar();

	return 0;
}
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773948
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklinz = (a++)*(-1) это не то же самое что z = (a+1)*(-1), это скорее z = (a)*(-1); a += 1

возможно речь шла про z = (++a)*(-1), тут должно быть -2

Интересно что код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	int a = 1;
		int b = 1;
		int c = 1;

		//int d = (a++)*(-1);

		a = (a++)*(-1);
		b = (b+1)*(-1);
		c = -(c++);



зависит от комментированной строки. Я такое уже как-то встречал, например
Код: plaintext
1.
2.
3.
4.
5.
A = 2;
A = 3;
if (0){
};
B = A;



Если убрать if, то результат будет другим нежели с if(0) =)

В коде выше ясно, почему зависит,
//int d = (a++)*(-1);
увеличивает а
а в вашем примере - загадка, почему
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773957
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из поинтов почему ФП (Scala в частности) отказалась от пред- пост- инкремента.
Он просто заменен на функцию сложения. (+) - это функция. Гарантии чистоты и отсуствия
побочных эффектов потребовали.

Код: plaintext
1.
a = a.+(1)




В сях инкремент - мощная штука. В одном из жлобских ассемблеров (под PDP) кажется функции инкремента,
разыменования и сравнения занимали 1 ассемблерную инструкцию. Точных ссылок я не помню.
Могу ошибаться. Пускай знающие подскажут т.к. PDP это была .. не моя эпоха скажем так.
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ одном из жлобских ассемблеров (под PDP) кажется функции инкремента,
разыменования и сравнения занимали 1 ассемблерную инструкцию.

Там был автоинкрементный/декрементный способ адресации, применимый к любой операции и
любому регистру.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39773995
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Инкремент/декремент есть во многих (возможно во всех) ассемблерах. Потому что технически проще на транзисторах сделать +1 чем +N.

Но в ассемблере нет пред-/пост-. ИМХО это уже синтаксический сахар в чистом виде.
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774001
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNose
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>

int a = 1;
int b = 1;
int c = 1;

int main()
{
    a = (a++)*(-1);
    b = (b+1)*(-1);
    c = -(c++);

    printf("%i ", a);
    printf("%i ", b);
    printf("%i ", c);

    return 0;
}



так как я явно задал приоритеты скобками, то ожидаю от компилятора разворачивание в вид

a = (a+1) * (-1);
b = (b+1) * (-1);
c = (c+1) * (-1);

соответственно ожидаю и ответы -2 для a, b, c.

однако компилятор gcc выдает -1-2-1

а компилятор vc++ вообще выдал 0 -2 0

-----------

можете объяснить?
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774014
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Вопрос немного не про то.
Вот точная фраза из с++ референс в части приоритета операторов:

Parts of the expressions can be enclosed in parenthesis to override this precedence order, or to make explicitly clear the intended effect.

Я явно задал приоритеты скобками, компилятор съел код.
Приоритет скобок ровно такой же как и у ++ независимо от пре или пост.
Я вправе расчитывать управление ходом расчетов с помощью скобок, не так ли?
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774019
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseЯ вправе расчитывать управление ходом расчетов с помощью скобок, не так ли?

Вправе. Но ты должен пояснить почему ты ожидаешь от (a++) результат 2. Инкремент а при
постфиксе происходит после получения его текущего значения и это не зависит от приоритета.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774021
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое выражение
Код: plaintext
1.
b = (a++)*(-1);


Эквивалентно
Код: plaintext
1.
2.
b = a*(-1);
a++;


Потому - что пост-инкремент исполняется после того как переменная поучаствовала в выражении.

Но у тебя a стоит еще и слевой части присвоения (!). Вопрос. Что должен сделать компиллятор?
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774023
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто должен сделать компиллятор?

Нормальный компилятор (GCC) полностью вычислит всё, что справа от знака присваивания,
включая побочные эффекты, перед выполнением собственно присваивания. У MS, очевидно,
другое мнение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774024
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
maytonТакое выражение
Код: plaintext
1.
b = (a++)*(-1);


Эквивалентно
Код: plaintext
1.
2.
b = a*(-1);
a++;


Потому - что пост-инкремент исполняется после того как переменная поучаствовала в выражении.

Но у тебя a стоит еще и слевой части присвоения (!). Вопрос. Что должен сделать компиллятор? компилятор должен выплюнуть ошибку.
Либо таки воспользоваться приоритетом скобок.
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774027
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNosemaytonТакое выражение
Код: plaintext
1.
b = (a++)*(-1);


Эквивалентно
Код: plaintext
1.
2.
b = a*(-1);
a++;


Потому - что пост-инкремент исполняется после того как переменная поучаствовала в выражении.

Но у тебя a стоит еще и слевой части присвоения (!). Вопрос. Что должен сделать компиллятор? компилятор должен выплюнуть ошибку.
Либо таки воспользоваться приоритетом скобок.
Причем здесь скобки?
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774028
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseЛибо таки воспользоваться приоритетом скобок.

У тебя в скобках операция, гарантированным результатом которой является
старое значение переменной. Скобки этого не в состоянии изменить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вопрос про приоритеты операций
    #39774029
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovmaytonЧто должен сделать компиллятор?

Нормальный компилятор (GCC) полностью вычислит всё, что справа от знака присваивания,
включая побочные эффекты, перед выполнением собственно присваивания. У MS, очевидно,
другое мнение.
операция присваивани, такая же операция - 21809246 , весь вопрос где заканчивается выражение
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / вопрос про приоритеты операций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]