Официальный сайт студ.городка НГТУ
Программирование и БД » Знатокам С++ 

#1  21.02.09 13:29

Знатокам С++

c=a+++b - дано выражение, каков будет результат?

Offline

#2  21.02.09 14:34

Я
Профиль

Re: Знатокам С++

c=a+(++b)

Offline

#3  21.02.09 18:57

Re: Знатокам С++

c=(a++)+b

Offline

#4  21.02.09 20:37

Re: Знатокам С++

Вроде Я прав =))
http://www.cyberguru.ru/programming/cpp … age35.html
у унарной операции "++" приоритет выше чем у аддитивной "+". унарные операции выполняются справа налево.
в таком случае, сначала b увеличится на 1,а потом прибавится к а.
В случае Matrim'a и прибавится к а и запишется в с,а потом уже а увеличится на 1.
Как то так)

ЗЫ.вычитал в инете:  там получается,что есть два варианта либо а++ либо ++b,так как приоритет у них одинаковый,то выполнение идет справа налево,следовательно a+(++b).
и опять таки я может заблуждаюсь))

Исправлено o\/o\/aN (21.02.09 21:37)

Offline

#5  22.02.09 00:18

Re: Знатокам С++

Здесь важен не приоритет операций, а то, как синтаксический анализатор распознает эти знаки. Возможно даже, что разные будут делать это по-разному.
По-моему, логичнее вариант

Matrim написал(а):

c=(a++)+b

потому что анализатор увидит первый +, потом проверит, не плюс ли следующий символ и поймет, что это ++. Либо будет так, что он увидит первый плюс, предварительно сочтет его обычным плюсом, а потом увидит второй плюс и проверит, не был ли предыдущий плюсом, и опять таки поймет, что это ++.

Offline

#6  23.02.09 15:31

Re: Знатокам С++

Kosh_Mar написал(а):

Возможно даже, что разные будут делать это по-разному

Согласен. Про данный пример не могу ничего сказать. Но в регулярных выражениях многозначные конструкции вроде .* разными компиляторами понимаются по-разному.

Offline

#7  26.02.09 13:12

Re: Знатокам С++

Код::

void main ()
{int a,b,c;
a=3;
b=7;
c=a+++b;
printf("a=%d b=%d c=%d",a,b,c);
getch();
}

Собственно этим примером можно проверить, что результат будет с=10 и а увеличется на единицу уже после сложения, т.к. операция ++ для переменной выполняется после вычесления выражения. А чтобы сначала увеличить а на 1, а потом уже сложить то вырожение будет с=++а+b  :)))

Offline

#8  28.02.09 10:13

Re: Знатокам С++

ALONSO написал(а):

Собственно этим примером можно проверить, что результат будет с=10 и а увеличется на единицу уже после сложения

в каком-то конкретном компиляторе :)

стандарт говорит, что все, о чем он не оговаривает явно зависит от реализации и что стандарт не против, если кто-то отстрелит себе ногу

Offline

#9  28.02.09 11:39

Я
Профиль

Re: Знатокам С++

Интересный пример оказался. :)
P.S. никогда так не пишите.

Offline

#10  03.03.09 11:55

Re: Знатокам С++

умные дядьки придумали скобки Дэн! )

Offline

#11  05.03.09 11:10

Re: Знатокам С++

c=a+(++b)

так и только так, и компиляторы С любые посчитают так. Вопрос в другом, а нахрена писать так??? Код должен быть понятен всем. Или задача поставленна сделать его не читабельным???

Offline

#12  05.03.09 12:04

Re: Знатокам С++

+VoFFka+, а у двоих на практике так получилось:

c=(a++)+b

Не вяжется с твоими словами

+VoFFka+ написал(а):

c=a+(++b)
так и только так

Offline

#13  05.03.09 12:57

Re: Знатокам С++

Все вяжется.

Код::

void main ()
{int a,b,c;
a=3;
b=7;
c=a+++b;
printf("a=%d b=%d c=%d",a,b,c);
getch();
}

с=10;
При этом если ты выведешь b значение будет 8, т.к. ++b выполнится последней.

Результат этой программульки:
c=10;
a=3;
b=8.
Проверяй.

А в варианте c=(a++)+b получилось бы 11.

Исправлено +VoFFka+ (05.03.09 12:58)

Offline

#14  05.03.09 13:44

Re: Знатокам С++

Это только подтверждает, что бывает по-разному. Ты одним примером хочешь утвердить, что у всех так будет?
Я не говорю, что у тебя там b не 8, я говорю, что у других людей в таком примере b не 8.
Это ты настаиваешь, что у всех будет одинаково, а доказываешь у себя дома на твоем компе.

Я хочу сказать, что ты не прав, говоря

+VoFFka+ написал(а):

только так

Offline

#15  05.03.09 16:41

Re: Знатокам С++

+VoFFka+ написал(а):

и компиляторы С любые посчитают так

вопрос был про с++, с и с++ - это разные языки :)

стандарт с++ от 2003 года говорит, что приоритет постфиксной операции выше, чем префиксной (таблички "приоритет операций", которые валяются в интернете использовать нельзя, если не указано для какого компилятора они нарисованы)

g++ v.3.4.6 и компилятор из 2008 студии собирают как c=(a++)+b, например

причем компилятор из студии собирает действительно по стандарту, т.е. берет старое значение переменной, выполняет действие, выполняет инкремент

Код: c++:

        int a=1,b=3,c;
 
        c=a+++b;
 
	return 0;

собирается как

Код: asm:

	mov	DWORD PTR _a$[ebp], 1
	mov	DWORD PTR _b$[ebp], 3
	mov	eax, DWORD PTR _a$[ebp]
	add	eax, DWORD PTR _b$[ebp]
	mov	DWORD PTR _c$[ebp], eax
	mov	ecx, DWORD PTR _a$[ebp]
	add	ecx, 1
	mov	DWORD PTR _a$[ebp], ecx


здесь есть оптимизация, что используется одна и та же переменная 'а'

если заставить компилятор её выключить (сказав, что блок будет выполняться параллельно), то все операции будут сделаны по стандарту

Код: c++:

        int a=1,b=3,c;
	#pragma omp parallel
	{
		c=a+++b;
	}
	return 0;

Код: asm:

	mov	eax, DWORD PTR _a$[ebp]
	mov	ecx, DWORD PTR [eax]
	add	ecx, DWORD PTR _b$[ebp]
	mov	edx, DWORD PTR _c$[ebp]
	mov	DWORD PTR [edx], ecx
	mov	eax, DWORD PTR _a$[ebp]
	mov	ecx, DWORD PTR [eax]
	add	ecx, 1
	mov	edx, DWORD PTR _a$[ebp]
	mov	DWORD PTR [edx], ecx

Offline

#16  05.03.09 18:55

Re: Знатокам С++

Matrim написал(а):

стандарт с++ от 2003 года говорит, что приоритет постфиксной операции выше, чем префиксной

Matrim, однако, прав. Только вот писать без скобок и полагаться на то, что выражения будут вычисляться слева направо - как минимум глупо, ибо может привести к непредсказуемым результатам.

Исправлено Revenger (05.03.09 19:01)

Offline

#17  08.03.09 20:20

Re: Знатокам С++

R0mm написал(а):

умные дядьки придумали скобки Дэн! )

Вообще-то на лекции надо ходить...

Offline

#18  09.03.09 16:00

Re: Знатокам С++

Мне кажется, что в этом случае ходящий на лекции решил выпендриться знаниями перед большинством таких вот, сомневающихся или считающих, что зависит от компилятора или стандарта C, или вот так копнувших дальше на уровень.
А всё на самом деле просто.
Начала программирования, приоритеты, унарные и бинарные операции.
Ключ к поиску "Здесь водятся Драконы! - старинная карта"

Offline

#19  14.03.09 21:15

Re: Знатокам С++

ALONSO,

ALONSO написал(а):

Вообще-то

Revenger написал(а):

полагаться на то, что выражения будут вычисляться слева направо - как минимум глупо

Offline

#20  29.03.09 10:58

Re: Знатокам С++

Извините что поднимаю эту тему, но просто нашел интересную статью втему))) Все дело в точках следования.
http://alenacpp.blogspot.com/2005/11/se … oints.html

Offline

#21  29.03.09 17:29

Re: Знатокам С++

chmaxx написал(а):

Все дело в точках следования.

мимо, это не тот случай :)
в обсуждаемой программе никто не пытается модифицировать одну и ту же переменную дважды, не пересекая при этом sequence point

Offline

#22  30.03.09 09:46

Я
Профиль

Re: Знатокам С++

Код::

int x=0;
x=x++;
cout<<x;

Вопрос: что выведется на экран? Ну что может быть проще - сейчас запустим да проверим. Я запустила MSVC++6.0, ответ получился 1.
Потом запустила gcc 3.4.4 и получился 0.

Мое представление о C++ рушится...

Offline

#23  30.03.09 09:52

Re: Знатокам С++

В этой ветке у двоих и получилось по-разному. Один правда при этом утверждал, что у всех должно быть, как у него.

Offline

Программирование и БД » Знатокам С++ 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.139 сек.
Выполнено 14 запросов.