LINUX.ORG.RU

увидел интересный способ присваивания.

 


1

1

На сайте http://wiki.osdev.org/Printing_To_Screen Увидел пример, и вот, кто нибудь знал о таком виде присваивания,

*ptr = "abcdef"[1];
я почему то думаю, что вижу впервые такое, но может что-то путаю.
#include <stdio.h>
#include <string.h>

int main ( )
{
  char buf[255];
  memset ( &buf, 32, 254 );
  buf[254] = 0;
  char *ptr = &buf[0];
  *ptr = "abcdefg"[1];

  printf ( "%s\n", buf );
}

a[b] = *(a+b) = *(b+a) = b[a]

То, что оно не оказалось очевидным для Вас, наглядно демонстрирует, что в нормальном (production-ready) коде такие трюки не к месту.

See also: http://ioccc.org/

anonymous
()

на место, куда указывает ptr пишем первый символ строки

samson ★★
()
Ответ на: комментарий от anonymous

это естественно

другое дело, что на c и не такое можно увидеть. Это же не значит, что так стоит писать

samson ★★
()
Последнее исправление: samson (всего исправлений: 1)

char *ptr = &buf[0];

а зачем вам ptr, когда у вас уже есть указатель - buf?

ps: а вообще, за такой код руки надо отрывать.

samson ★★
()
Ответ на: комментарий от samson

Посмотри предыдущие треды ТС и всё поймёшь.

Deleted
()
Ответ на: комментарий от anonymous

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

void(*ptr)() = NULL;
ptr();
и без ворнигов))

samson ★★
()
Последнее исправление: samson (всего исправлений: 1)

[:|||||:] причём порванный. :) Нотация a[b] — это просто сахар для *(а + b).

А от

*ptr = 1["abcdef"];
тебе совсем крышу сорвёт.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)

Ничего интересного. Строка - массив символов. Взять из массива N-й элемент - обычное дело.

saahriktu ★★★★★
()

Если уж ты дорос до таких «высот», то пиши как нормальный человек:

memset ( &buf, 32, 254 );
memset ( buf, 32, 254 );

char *ptr = &buf[0];
char *ptr = buf;

LamerOk ★★★★★
()
Ответ на: комментарий от beastie

Тьфу блин, пялился минуту пока въехал, строка с толку сбивает, сжалился бы, просто '\0' вписал :D

Dron ★★★★★
()
Ответ на: комментарий от Dron

TL;DR:

#include <stdio.h>

int
main()
{
        char *x = "abcdef";
        char y[] = "abcdef";

        printf("%c\n", x[1]);
        printf("%c\n", 1[x]);

        printf("%c\n", y[1]);
        printf("%c\n", 1[y]);

        printf("%c\n", "abcdef"[1]);
        printf("%c\n", 1["abcdef"]);

        printf("%c\n", *(x + 1));
        printf("%c\n", *(y + 1));

        return 0;
}
печатает 8 раз 'b' и суть одно и тоже.

beastie ★★★★★
()
Ответ на: комментарий от beastie

Да,всё вполне логично, но конкретно такая запись 1["abcdef"] и 1[y] как то инородно выглядит, хотя так "abcdef"[1] вполне себе нормально (выглядит).

P.S. Ты всё админишь иль в dev подался?)

Dron ★★★★★
()
Ответ на: комментарий от Dron

хотя так «abcdef»[1] вполне себе нормально (выглядит).

Это выглядит глупо, ибо эквивалентно 'b' всегда и без всякого изврата, который тут ничего дополнительного не может сделать и потому никогда не нужен. Другое дело, когда [1] - вычисляется, а строка «abcdef» используется как специальный флаг в алгоритме.

vodz ★★★★★
()
Ответ на: комментарий от vodz

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

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Присваивание - это фигня.

#include <stdio.h>

void printi(int i)
{
	!i?({
		printf("0\n");
		printf("zero\n");
	}):i==1?({
		printf("1\n");
		printf("one\n");
	}):i==2?({
		printf("2\n");
		printf("two\n");
	}):!!!!!!1111111;
}

int main(void)
{
	for(int i = 0; i < 3; i++)
		printi(i);

	return 0;
}
alexku
()

ой лол, не вкурсе что пара двойных кавычек возвращает адрес на .rodata/.data секцию с данными внутри кавычек? лел. Или не знаком с адресной арифметикой?

Читай мануалы штоле

reprimand ★★★★★
()
Ответ на: комментарий от Deleted

смысл в этом очень даже может быть.

Вы из тех, кто дальше первого предложения комментарии не читают?

vodz ★★★★★
()
Ответ на: комментарий от next_time

магическая константа

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

vodz ★★★★★
()
Ответ на: комментарий от vodz

Ну ок, в данном конкретном случае ( на который топикстартер ссылается), это относительно хороший вариант, но всё равно потребовавший комментария, так что на 3-чку там самодокументированность.

next_time ★★★★★
()
Ответ на: комментарий от Gargamel

buf[254] = 0;

Так не стоит делать, код становится непонятным. Лучше вот так:

buf[254] = '\0';

И что, понятно становиться? Ноль, он и в ascii ноль. Зачем мне символ нуля писать, если и так понятно, что и за чем. Может вам только не понятно одному.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Dron

Ноль, он и в ascii ноль.

Ноль там это 53, а '\0' это конец строки и 0

Ну ты же понимаешь что я ноль имею ввиду число, которое в ascii имеет значение

000   0     00    NUL '\0' (null character) 
Я же не присваиваю 53, я присваиваю ноль.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Забей. Тебе дают нормальные советы, но они относятся к нормальным программам, в которых время чтения кода в десятки раз превышает время написания. Нормальные программы поддерживаются годами, и там важно, чтобы они выглядели хорошо.

Для write-only, которые ты пишешь, это не имеет никакого смысла.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Забей. Тебе дают нормальные советы, но они относятся к нормальным программам, в которых время чтения кода в десятки раз превышает время написания. Нормальные программы поддерживаются годами, и там важно, чтобы они выглядели хорошо.

Для write-only, которые ты пишешь, это не имеет никакого смысла.

А ты станешь к этому совету прислушиваться?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от i-rinat

Знаешь, а я помню тот слоган, который у тебя в профиле написан. Я хорошо помню тот прикол. Там моисей с кем то бился. И тогда в бою противника на две части чем то разделили. И моисей такой говорит, господь, это не честно, двое на одного. А господь такой отвечает - я разрешаю.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

А моисей такой говорит: я запрещаю! И бог такой: okay :(

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

0 это просто ноль, он может быть так и int,так и short, так и long. А запись '\0' указывает на символьную природу и что перед нами конец строки. Так же именно поэтому при работе с указателями используют именно NULL, а не 0, чтобы показать что здесь идёт работа с указателями. Это вопрос стиля кода.

Gargamel
()
Ответ на: комментарий от Gargamel

0 это просто ноль, он может быть так и int,так и short, так и long. А запись '\0' указывает на символьную природу и что перед нами конец строки. Так же именно поэтому при работе с указателями используют именно NULL, а не 0, чтобы показать что здесь идёт работа с указателями. Это вопрос стиля кода.

Полный ответ. Ну ясно.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Gargamel

Из разряда советов а ля code complete. На одни и те же советы кто-то фыркает, мол, это не нужно, а кто-то смотрит с недоумением, мол, всегда так делаю.

Либо само приходит со временем, либо так и остаётся непонятым.

i-rinat ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Ну ты же понимаешь что я ноль имею ввиду число, которое в ascii имеет значение

Услышав «символ нуля» нормальный программист поймёт, что ты имеешь ввиду '0' или число 0x32. А то, что ты имеешь ввиду, на самом деле не символ нуля, а нулевой символ.

В общем, как сказал, так тебя и поняли. Символ нуля - одно, нулевой символ - совсем другое.

alexku
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.