азбука, арифметика

Oct 10, 2009 20:04



(i++)++ => ((t2 = ((t1 = i), (i = (i + 1)), t1)), (i = (i + 1)), t2)

programming

Leave a comment

Comments 9

archaicos October 10 2009, 18:10:50 UTC
У тебя скобки несбалансированы. И если это C/C++, то вроде не хватает звездочки перед i.

Вот тебе поинтереснее (чур не гуглить и не запускать):

#include
char *c[]=
{
"ENTER",
"NEW",
"POINT",
"FIRST"
};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp=cp;
int main(void)
{
printf("%s", **++cpp);
printf("%s ", *--*++cpp+3);
printf("%s", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1);
return 0;
}

Reply

mr_top October 11 2009, 22:01:19 UTC
это си, звездочка не нужна, результат ++ - l-value. это преобразование выражений ++, -- и op= в выражения без этих трюков (например, в такие как разрешены в паскале... ну кроме операции запятая, без нее такое сделать нельзя). последние сутки писал реализацию такого автоматического преобразования, вот и вылилось чуток в ЖЖ). скобки не балансированы из-за проклятого copy-paste).

а это извращение какое-то). первая буква вроде T, а остальное... TEST? )

Reply

archaicos October 11 2009, 22:34:34 UTC
Результат ++ - не L-value, а R-value.
Если i типа int, (i++)++ не компилируется (gcc: error: invalid lvalue in increment).
Не компилируется также и &(i++) - взятие адреса от этого value (error: invalid lvalue in unary `&'), но компилируется 1&(i++) - логическое И.

В "извращении" первая буква P - следи внимательней (сделай картинку или несколько).

Reply

mr_top October 11 2009, 23:16:22 UTC
хм. и правда r-value, перепрограммировал(
Зато вот так можно:
int i = 1;
i += i += 1;

Ответ: POINTER STEW
Признаюсь, сделал еще одну ошибку на ER). а задача-то простая конечно. вобщем, на пенсию пора... или там идти на C# писать))

Reply


folgakauchuk October 13 2009, 19:18:48 UTC
да.

Reply


Leave a comment

Up