Почему здесь ошибка
От: Аноним  
Дата: 25.05.11 12:19
Оценка:
int x,int y
//--------
int* p=&++x;
int* q=&(x++);


Почему префиксная и постфиксная запись отличаются т.е. почему int* q=&(x++);
при компиляции в vc выдает error C2102: '&' requires l-value
Re: Почему здесь ошибка
От: savitar  
Дата: 25.05.11 12:26
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>
А>int x,int y
А>//--------
А>int* p=&++x;
А>int* q=&(x++); 
А>


А>Почему префиксная и постфиксная запись отличаются т.е. почему int* q=&(x++);

А>при компиляции в vc выдает error C2102: '&' requires l-value

потому что во втором случае создается временный объект.
Re: Почему здесь ошибка
От: uzhas Ниоткуда  
Дата: 25.05.11 12:34
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Почему префиксная и постфиксная запись отличаются т.е. почему int* q=&(x++);

потому что & требует l-value
на пальцах: адрес вы можете узнать у объекта, которого вы держите (то есть у которого есть имя)
выражение ++x является l-value по стандарту, то есть возвращает тот же самый x и есть возможность взять у него адрес
выражение x++ является r-value, то бишь там возвращается временный объект, хранящий предыдущее значение x. а у временных объектов нет возможности взять адрес. вы же ими не владеете
можете сделать так:
int z = x++;
&z;
const int& t = x++;
&t; // <- адрес временного объекта  :)))

напомню, что ++x возвращает ссылку на проинкременченный объект, а x++ инкрементит x, но возвращает его предыдущее значение (то есть возвращает его старую копию в виде временного (безымянного) объекта)), то есть если int x = 10;, то ++x вернет 11, а x++ вернет 10 (хотя в обоих случаях новое значение х будет равно 11)
Re: Почему здесь ошибка
От: Mr.Delphist  
Дата: 26.05.11 09:27
Оценка: -4 :))
Здравствуйте, Аноним, Вы писали:
int* q=&(x++);


Немного оффтопа: звездочка относится к переменной, а не к типу, поэтому "int* a,b" и "int *a,*b" означают не одно и то же
Поэтому гигиеничней писать так:
int *q=&(x++);
Re[2]: Почему здесь ошибка
От: Mr.Delphist  
Дата: 22.06.11 08:43
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Здравствуйте, Аноним, Вы писали:

MD>
MD>int* q=&(x++);
MD>


MD>Немного оффтопа: звездочка относится к переменной, а не к типу, поэтому "int* a,b" и "int *a,*b" означают не одно и то же

MD>Поэтому гигиеничней писать так:
MD>
MD>int *q=&(x++);
MD>


Минусёры, ау! Аргументируем!
Re[3]: Почему здесь ошибка
От: Erop Россия  
Дата: 22.06.11 09:39
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Минусёры, ау! Аргументируем!


Мне смешно, как с оценок, так и с самого сообщения!
IMHO, это хорошая тема для КСВ, такая же, как tab vs space или там, сколько позиций в самом лучшем отступе
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Немного оффтопа
От: B0FEE664  
Дата: 22.06.11 09:48
Оценка: +1
Здравствуйте, Mr.Delphist, Вы писали:

MD>Немного оффтопа: звездочка относится к переменной, а не к типу, поэтому "int* a,b" и "int *a,*b" означают не одно и то же

'*' менят тип, а не переменную. Значит она относится к типу.

MD>Поэтому гигиеничней писать так:

MD>
MD>int *q=&(x++);
MD>


"Гигиенично" указать отдельно тип для каждой переменной при декларации. А значит писать надо так:
int* q = &i;
int** pp = &q;

потому, что ясно видно, что это объявление и '*' задаёт/модифицирует тип, а не переменную и это не присвоение, как здесь:
*pp = &j;
И каждый день — без права на ошибку...
Re[3]: Немного оффтопа
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 23.06.11 08:12
Оценка: +2
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Mr.Delphist, Вы писали:


MD>>Немного оффтопа: звездочка относится к переменной, а не к типу, поэтому "int* a,b" и "int *a,*b" означают не одно и то же

BFE>'*' менят тип, а не переменную. Значит она относится к типу.

MD>>Поэтому гигиеничней писать так:

MD>>
MD>>int *q=&(x++);
MD>>


BFE>"Гигиенично" указать отдельно тип для каждой переменной при декларации. А значит писать надо так:

BFE>
BFE>int* q = &i;
BFE>int** pp = &q;
BFE>

BFE>потому, что ясно видно, что это объявление и '*' задаёт/модифицирует тип, а не переменную и это не присвоение, как здесь:
BFE>
BFE>*pp = &j;
BFE>

Думаю, что в грамматике правило будет выглядеть подобным образом (псевдо)
declaration_var_part = identifier | '*' identifier | '&' identifier ... и т/д
declaration_expr = declaration_var_part ';' | declaration_var_part ',' declaration_expr ';'

Так, что синт.анализатор свернет раньше экпрешн с спецификатор + идентификатор , а после займется сверткой выражения вцелом. отдюда int *a — кошернее
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[4]: Немного оффтопа
От: ollv СССР https://youtu.be/DQDoYs6wHoo
Дата: 23.06.11 08:54
Оценка:
Здравствуйте, ollv, Вы писали:

O>Здравствуйте, B0FEE664, Вы писали:


O> Так, что синт.анализатор свернет раньше экпрешн с спецификатор + идентификатор , а после займется сверткой выражения вцелом. отдюда int *a —

кошернее
точнее
 declaration_var_part = identifier | '*' identifier | '&' identifier ... и т/д
 declaration_expr0 = declaration_var_part | declaration_var_part ',' declaration_expr0 
 declaration_expr = declaration_var_part ';'

[/ccode] а то конфликтс .
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Re[4]: Немного оффтопа
От: B0FEE664  
Дата: 23.06.11 09:06
Оценка:
Здравствуйте, ollv, Вы писали:

O> Так, что синт.анализатор свернет раньше экпрешн с спецификатор + идентификатор , а после займется сверткой выражения вцелом. отдюда int *a — кошернее

Ага, халяльнее... Зачем синт(етическому)анализатору кошерный код ?

Текст программы, по возможности, пишется так, что бы было удобно человеку, а не анализатору. Иначе, все бы так и писали на ассемблере.
И каждый день — без права на ошибку...
Re[4]: Почему здесь ошибка
От: Mr.Delphist  
Дата: 23.06.11 10:11
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Mr.Delphist, Вы писали:


MD>>Минусёры, ау! Аргументируем!


E>Мне смешно, как с оценок, так и с самого сообщения!

E>IMHO, это хорошая тема для КСВ, такая же, как tab vs space или там, сколько позиций в самом лучшем отступе

Т.е. ты считаешь, что
int* a, b;

описывает два указателя?
Re[5]: Почему здесь ошибка
От: Erop Россия  
Дата: 23.06.11 10:14
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

E>>Мне смешно, как с оценок, так и с самого сообщения!

E>>IMHO, это хорошая тема для КСВ, такая же, как tab vs space или там, сколько позиций в самом лучшем отступе

MD>Т.е. ты считаешь, что

MD>
MD>int* a, b;
MD>

MD>описывает два указателя?

Там уже был ответ, с которым я полностью согласен.

1) Этот код ЛУЧШЕ оформлять так:
int* a;
int b;

2) Если кто-то оформляет код как-то иначе, то тоже ничего страшного

Ну и от себя добавлю, что программист, которому ТРУДНО читать код
int* a, b;
и который думает или, хотя бы, может подумать, что это два указателя профессионально непригоден...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.