#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
#10 03.03.09 11:55
#11 05.03.09 11:10
#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
#18 09.03.09 16:00
Re: Знатокам С++
Мне кажется, что в этом случае ходящий на лекции решил выпендриться знаниями перед большинством таких вот, сомневающихся или считающих, что зависит от компилятора или стандарта C, или вот так копнувших дальше на уровень.
А всё на самом деле просто.
Начала программирования, приоритеты, унарные и бинарные операции.
Ключ к поиску "Здесь водятся Драконы! - старинная карта"
Offline
#19 14.03.09 21:15
#20 29.03.09 10:58
Re: Знатокам С++
Извините что поднимаю эту тему, но просто нашел интересную статью втему))) Все дело в точках следования.
http://alenacpp.blogspot.com/2005/11/se … oints.html
Offline
#21 29.03.09 17:29
#22 30.03.09 09:46
#23 30.03.09 09:52
Re: Знатокам С++
В этой ветке у двоих и получилось по-разному. Один правда при этом утверждал, что у всех должно быть, как у него.
Offline

