Russian Qt Forum

Программирование => С/C++ => Тема начата: OKTA от Февраль 14, 2014, 12:23



Название: А вот еще мелочь еще менее известная)
Отправлено: OKTA от Февраль 14, 2014, 12:23
Что будет на выходе?)

Код:
int main () 
{
    char *c;
    *c = 'A';
    printf("%c\n", 0[c]);
    printf("%c\n", c[0]);

    return 0;

}


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: kambala от Февраль 14, 2014, 12:42
будет краш. а оба варианта индексации тождественны (хотя вариант 0[c] никогда в реальном коде не встречал).


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: Alex Custov от Февраль 14, 2014, 14:24
неинициализированный указатель, насколько я помню, - UB.


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: OKTA от Февраль 14, 2014, 14:55
В целом, код валиден только для си и в с++ будет откидываться с ворнингом на то, что указатель не инициализирован и нельзя присваивать char в char*, но хотел обратить внимание именно на индексацию  ;D


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: Alex Custov от Февраль 14, 2014, 17:52
но хотел обратить внимание именно на индексацию  ;D

Об этом обычно не рассказывают, но можно допереть и самому, т.к.
Код:
a[i]
логически раскладывается в *(a + i). Ну раз пошла такая пьянка, то вот пример получше. Что напечатает? Чистый Си.

Код
C
int main()
{
   int a[] = <%3,01%>;
   printf("%d\n", 1<:a:>);
 
   return 0;
}


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: Day от Февраль 15, 2014, 11:30
В целом, код валиден только для си и в с++ будет откидываться с ворнингом на то, что указатель не инициализирован
В чистом С тот же варинг
Цитировать
и нельзя присваивать char в char*,
А тут ничего подобного нет.


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: OKTA от Февраль 15, 2014, 14:21
но хотел обратить внимание именно на индексацию  ;D

Об этом обычно не рассказывают, но можно допереть и самому, т.к.
Код:
a[i]
логически раскладывается в *(a + i). Ну раз пошла такая пьянка, то вот пример получше. Что напечатает? Чистый Си.

Код
C
int main()
{
   int a[] = <%3,01%>;
   printf("%d\n", 1<:a:>);
 
   return 0;
}

OMG, стыд и срам!) что это? <:a:>, <%3,01%>??) где почитать?))))))


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: Alex Custov от Февраль 16, 2014, 22:45
OMG, стыд и срам!) что это? <:a:>, <%3,01%>??) где почитать?))))))

Если ты не знаешь что это, следовательно не читал стандарт, хотя это стоило бы сделать, потому что об этом обычно вообще не рассказывают на обучении. Банальный поиск "<%" по http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf сразу даёт ответ :) Так что напечатает?


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: kambala от Февраль 16, 2014, 23:04
печатает 1 ибо 1[a] :)


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: OKTA от Февраль 17, 2014, 09:08
Да, 1)) Спасибо  :)


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: Igors от Февраль 17, 2014, 14:25
Если ты не знаешь что это, следовательно не читал стандарт, хотя это стоило бы сделать, потому что об этом обычно вообще не рассказывают на обучении. Банальный поиск "<%" по http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf сразу даёт ответ :) Так что напечатает?
Ну и когда Вы использовали такой сынтаксыс в последний раз? :)

OMG, стыд и срам!) что это? <:a:>, <%3,01%>??) где почитать?))))))
Нет никакого стыда/срама. Сам автор библии говорит что узнал о языке много нового. Др словами мы никогда не будем знать "все" о языке - и это хорошо, чтобы не пропадал интерес.


Название: Re: А вот еще мелочь еще менее известная)
Отправлено: OKTA от Февраль 17, 2014, 14:32
 :) affirmative  ;)