LINUX.ORG.RU

Не понятна строка на языке Си. Синтаксис стандарт Си.


0

0

Есть замечательный пример сниффера:

http://www.xakep.ru/post/16270/sniffer-demo.zip

в нём есть замечательная строка:

u8 *ptr = out;

sprintf(ptr,"Source MAC Address: "), ptr+=20;

Я не мастер стандарта языка Си и мне не понятно, каким образом, после закрывающей скобки можно поставить запятую. Всю жизнь думал, что должна быть точка с запятой. Что означает сия конструкция?

anonymous

оператор запятая.

Присутствует в языке начиная с K&R

dilmah ★★★★★
()

Вместо xaker.ru, лучше бы ты Кернигана и Ричи читал. И глупых вопросов тут не задавал. "хакеры", блин.

Вообщем читай про оператор запятая. В данном коде он используется не совсем по назначению и может быть заменен на ";".

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

2all:

Я виноват, что статья с рабочим примером сниффера для работы с МАС адресами расположен именно на этом сайте?

Какой смысл ставить запятую, если можно поставить точку с запятой? Ради чего ухудшать чи

табельность программ?

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

> Какой смысл ставить запятую, если можно поставить точку с запятой? Ради чего ухудшать читабельность программ?

какеры

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

> Я виноват, что статья с рабочим примером сниффера для работы с МАС адресами расположен именно на этом сайте?

Виноват, что в такие гадюшники за примерами лезешь.

Сырцы tcpdump, заметь, хостятся вовсе не на сайте какера.

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

Низким уровнем и ненадежностью источника. Зачем слушать Битлз в перепеве Рабиновича, когда лучше и проще послушать сразу оригинал?

anonymous
()

Вообще, думаю, автор хотел подчеркнуть некую логическую единость этих двух строчек.

Legioner ★★★★★
()

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

Особенно я рад за тех, кто в такие ветки попадает через поисковик. А вместо ответа - читай доку. И так 98% рунета. Из-за высоколобых красноглазов, которые кичатся знанием, но не хотят им делиться, процент чистой информации в рунете забит вот таким шумом.

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

6.5.17 Comma operator

Syntax
1 expression:
assignment-expression
expression , assignment-expression
Semantics
2 The left operand of a comma operator is evaluated as a void
expression; there is a sequence point after its evaluation. Then the
right operand is evaluated; the result has its
type and value.95) If an attempt is made to modify the result of a comma operator or to
access it after the next sequence point, the behavior is undefined.
3 EXAMPLE As indicated by the syntax, the comma operator (as described in this subclause) cannot
appear in contexts where a comma is used to separate items in a list (such as arguments to functions or lists
of initializers). On the other hand, it can be used within a parenthesized expression or within the second
expression of a conditional operator in such contexts. In the function call
f(a, (t=3, t+2), c)
the function has three arguments, the second of which has the value 5.

95) A comma operator does not yield an lvalue.

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

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

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

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

anonymous
()

> Что означает сия конструкция?

Операция запятая, последовательное исполнение выражений, вернуть результат последнего выражения.

С помошью && || можно имитировать ленивые вычисления (см. пример в описании ключевого слова lazy и делегатов в D 2.0, 1.0, вызвать вторую часть выражения "лениво" если не ясен результат после первой).

С помощью запятой можно наоборот, заставить выполнять все операции. Из полезных применений: несколько переменных цикла в for. for(node=root;node->next;oldnode=node,node=node->next) {..}

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

В некоторых языках программа это и есть выражение. В С отдельно живут выражения, а отдельно управляющие конструкции. Создатели С инстинктивно понимали слабость этого, поэтому продублировали некоторые управляющие конструкции в виде операторов, которые можно использовать в выражениях. Так, if-else превратился в оператор ?:, а последовательное выполнение превратилось в оператор запятую.

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

> "Программист", не способный читать документацию на английском языке, на хрен не нужен. Точно так же, как на хрен никому в мире не нужна документация на русском языке.

Идиот. Ты еще скажи, что чтобы ребенка считать научить, надо чтоб сначал осилил понятия типа "система счисления", "операция сложения". А если ребенок этого не понял, ему и раз-два-три объяснять ненужно.

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

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

> и о ужас!!! пишушие камменты на родном языке!

действительно, ужас..

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

> Идиот

Это ты представился? Самокритичненько.

> Ты еще скажи, что чтобы ребенка считать научить, надо чтоб сначал осилил понятия типа "система счисления",

Нет. Ему цифры показать надо сначала.

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

Лжешь. Нет таких. Ламеры такие есть, да, признаю. Пишущие паршивый говнокод, на хрен никому не нужный. А вот "программеров", не способных читать первоисточники, извини, не существует. Потому что просто не существует минимально достаточного количества материала на русском языке. Невозможно программисту научиться программировать, не зная на самом базовом уровне английского.

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

>Какой смысл ставить запятую, если можно поставить точку с запятой? >Ради чего ухудшать читабельность программ?

http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest


#include <stdio.h>
main(t,_,a)char *a;{return!0$t?t$3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t$_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_$13?
main(2,_+1,"%s %d %d\n"):9:16:t$0?t$-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
}'+}##(!!/")
:t$-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0$t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

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

> А вместо ответа - читай доку. И так 98% рунета.

- Что такое RTFM?
- RTFM!

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

ЗЫ: сейчас этот клоун станет втирать, что можно научиться программировать, почитывая "Какер".

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

> в виде операторов, которые можно использовать в выражениях. Так, if-else превратился в оператор ?:, а последовательное выполнение превратилось в оператор запятую.

кстати, непонятно. Почему в ?: можно lvalue, а в "," -- нельзя.

Почему func(a,b,c) = (*pfunc)(a,b,c) = (ODD_PROTO_T)(*local_func)(a,b,c,d,dummy,...) и соответственно int main (int argc, char ** argv, ..) = void main() (то есть, функция вызывается не с тем прототипом, с которым она скомпилирована в реализации, а с тем совместимым с ним прототипом, с которым описана декларация, а поскольку прототипы на таком уровне совместимы, то функция линкуется нормально)

Вроде symbol превратился в (*pfunc), а 'symbol в pfunc, но с указателями на другие типы, а не на функции такой фокус не проходит, разный sizeof :))

anonymous
()

Это им Касперски рассказал об удобстве запятой в циклах for, а "хакеры" как всегда юзают ее совсем неправильно — вместо точки с запятой.

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

1.c:2:28: error: invalid suffix "$t" on integer constant
1.c: In function ‘main’:
1.c:2: error: ‘t$3’ undeclared (first use in this function)
1.c:2: error: (Each undeclared identifier is reported only once
1.c:2: error: for each function it appears in.)
1.c:3: error: ‘t$_’ undeclared (first use in this function)
1.c:3: error: ‘_$13’ undeclared (first use in this function)
1.c:4: error: ‘t$0’ undeclared (first use in this function)
1.c:4: error: ‘t$’ undeclared (first use in this function)
1.c:13:2: error: invalid suffix "$t" on integer constant

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

хахаха

У фирмы мисубиши часть документации на роботы на инглише, а часть на немецком. Ессно они не парятся и не переводят всё на инглиш.

Желаю удачи тому, кто хочет запрограммировать этих роботов (кстати на бейсике), потому что придётся знать не только инглиш, но и немецкий.

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

>Лжешь. Нет таких. Ламеры такие есть, да, признаю. Пишущие паршивый говнокод, на хрен никому не нужный. А вот "программеров", не способных читать первоисточники, извини, не существует. Потому что просто не существует минимально достаточного количества материала на русском языке. Невозможно программисту научиться программировать, не зная на самом базовом уровне английского.

Я пишу код так, чтобы его могли понять как можно больше программистов. Т.е. мой код можно нормально поддерживать - исключать ошибки, добавлять функциональность и т.д. В результате время жизни и ценность моего кода несколько лет. Это состоявшийся факт.

Можно конечно выучить стандарт, но если мой код будет понимать один программист из 1000, то нах кому нужен такой код? Как искать в нём ошибки и добавлять функциональность другим программистам? Вот возникла простейшая проблема с примером на хакере - это нормально?

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

Несколько месяцев назад столкнулся со случаем. Вместо того, чтобы выкинуть код С++ написанный шесть лет назад, предлагают деньги за его переделку. А код извините, не поддерживают даже разработчики (!). Тогда какой смысл перерабытывать этот код? Не лучше ли переписать всё с нуля на java? Не кажется ли, что (сори) говно режут скальпелем? Однако западные заказчики платят за это деньги.

Всем спасибо за прояснение за запятую. С этим кодом разберусь и перепишу на паскале. Тогда в моём коде будет не только проще искать ошибки и добавлять функциональность, но он будет также быстрее компилиться. Код будет open source и с коментами.

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

Недавно, когда Хабра падала, можно было посмотреть исходники каких-то модулей, на похапе есесно. Так вот, там комменты по-русски.
Что-то вроде:
/**
* *
* @param $query
* SQL запрос, который нужно пагинировать
* @param $limit
* число элементов на странице
* @param $element
* это то что Васёк просил сделать
* @param $count_query
* SQL используемы для математики всякой
* @return
* Результат или фолс
*/

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

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

ТОЛСТО :)

А если ты и не троль, то просто молоденький дурашко.

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

> Желаю удачи тому, кто хочет запрограммировать этих роботов (кстати на бейсике), потому что придётся знать не только инглиш, но и немецкий.

Не проблема. Анонимус знает английский и немецкий.

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

> Зачем слушать Битлз в перепеве Рабиновича, когда лучше и проще послушать сразу оригинал?

в оригинале было Паваротти. А как раз битлз рабиновичем заменить можно ;)

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

> Я пишу код так, чтобы его могли понять как можно больше программистов. Т.е. мой код можно нормально поддерживать - исключать ошибки, добавлять функциональность и т.д. В результате время жизни и ценность моего кода несколько лет. Это состоявшийся факт.

Делфист?

> перепишу на паскале

Ну да, так и есть.

// представляю себе как поддержит твой код кучка ламеров, для которых ты "стараешься"

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

> кстати, непонятно. Почему в ?: можно lvalue, а в "," -- нельзя.

в С99 lvalue не является результатом ни ?:, ни запятой.

C99# A conditional expression does not yield an lvalue.

В С++98 и ?: и запятая могут дать lvalue.

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

> Можно конечно выучить стандарт, но если мой код будет понимать один программист из 1000, то нах кому нужен такой код?

Не путай Си и С++. Стандарт Си - крошечный, там учить нечего.

> но если мой код будет понимать один программист из 1000, то нах кому нужен такой код?

Нах нужны "программисты" на Си, которые даже не знают стандарта?

> Вот возникла простейшая проблема с примером на хакере - это нормально?

Тот, у кого возникла проблема - не программист вообще, а максимум школьник. Программист, любой, даже самых плохонький, прекрасно осведомлен о том, где и как посмотреть документацию на используемый им язык.

> Вместо того, чтобы выкинуть код С++ написанный шесть лет назад, предлагают деньги за его переделку.

Не сравнивай C++ и Си. На C++ проще простого написать write only code, пользуясь кучкой неоднозначных и неочевидных правил неявного преобразованоия и прочей невнятной чушью. В Си же такого нет.

> Тогда в моём коде будет не только проще искать ошибки и добавлять функциональность, но он будет также быстрее компилиться. Код будет open source и с коментами.

На хер твой код не нужен, когда есть tcpdump и прочие подобные утилиты.

P.S. В общем, всё ясно с интеллектуальным уровнем любителей почитать "какера".

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

>Не путай Си и С++. Стандарт Си - крошечный, там учить нечего.

фак в том, что gcc поддерживает в Си некоторые конструкции из С++:

for(int i=0;i<10;i++){}

>Тот, у кого возникла проблема - не программист вообще, а максимум школьник. Программист, любой, даже самых плохонький, прекрасно осведомлен о том, где и как посмотреть документацию на используемый им язык.

Не путайте доку на Линукс и MSDN

>Не сравнивай C++ и Си. На C++ проще простого написать write only code, пользуясь кучкой неоднозначных и неочевидных правил неявного преобразованоия и прочей невнятной чушью. В Си же такого нет.

в gcc добавляют примочки С++ это очевидный состоявшийся факт, даже мне не знающему (думаю) более 60% от стандарта Си.

>На хер твой код не нужен, когда есть tcpdump и прочие подобные утилиты.

я пальцем не пошевелю, чтобы дублировать tcpdump, задачи у приложения другие

>P.S. В общем, всё ясно с интеллектуальным уровнем любителей почитать "какера".

не берусь судить об интеллектуальном уровене хакеров - пользуюсь поисковиками, в форум пишу в крайнем случае

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

>> В общем, всё ясно с интеллектуальным уровнем любителей почитать "какера".

Слова латентного какериста... или какераста

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

> фак в том, что gcc поддерживает

Пользоваться расширениями gcc - не комильфо.

> Не путайте доку на Линукс и MSDN

Мсье тупой? Мсье баран? Мсье не в курсе, где стандарт языка посмотреть?

> в gcc добавляют примочки С++

И кого это колышет? Оператор ',' - из стандарта языка Си, причем он там был с самого начала, ещё в K&R варианте.

> я пальцем не пошевелю, чтобы дублировать tcpdump, задачи у приложения другие

tcpdump универсален. Если тебе надо его "дублировать" - то ты дурак. Если ты не в состоянии его использовать из внешней програмы - то ты дурак.

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

>Пользоваться расширениями gcc - не комильфо.

скажите это разработчикам ядра, ещё скажи им, что не надо использовать полухакерских извращений, которые ограничивают опцию оптимизации на -O2

>Мсье тупой? Мсье баран? Мсье не в курсе, где стандарт языка посмотреть?

мсье думает, что имеет значение тот стандарт, который РЕАЛЬНО поддерживается компилятором, да даже читать стандартна Си не охота - достаточно знаний на уровне обезьяны

>И кого это колышет? Оператор ',' - из стандарта языка Си, причем он там был с самого начала, ещё в K&R варианте.

ни в одной книге для детей не видел таких конструкций, мне не понятно зачем заменять ; на , - такие примудрости не для моего ума

>tcpdump универсален. Если тебе надо его "дублировать" - то ты дурак. Если ты не в состоянии его использовать из внешней програмы - то ты дурак.

мне не надо его дублировать, программа будет решать другие задачи

может я и дурак, но упражняться в извращениях стандартов точно не буду

программа должна быть понятной ВСЕМ, а не только представителям высшей рассы

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

на делфи не писал, вод венду очень мало писал, пока linux only

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

> скажите это разработчикам ядра

Ядро вне gcc не имеет смысла, так что не гони. Любой другой код потенциально переносим на другие компиляторы, и, соответственно, использование gcc-специфичных расширений неприемлимо.

> мсье думает, что имеет значение тот стандарт, который РЕАЛЬНО поддерживается компилятором,

Идиот. Имеет значение то ОБЩЕЕ подмножество стандарта, которое поддерживается большинством популярных компиляторов. Для Си это подмножество как минимум совпадает полностью с ANSI.

> да даже читать стандартна Си не охота - достаточно знаний на уровне обезьяны

У тебя не только знания на уровне обезьяны, у тебя и интеллект не выше чем у трехлетнего шимпанзе.

> ни в одной книге для детей не видел таких конструкций,

K&R не читал, тупица?

> программа должна быть понятной ВСЕМ, а не только представителям высшей рассы

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

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

> скажите это разработчикам ядра, ещё скажи им, что не надо использовать полухакерских извращений, которые ограничивают опцию оптимизации на -O2

смотря какого ядра. Разумные разработчики netbsd сейчас импортировали pcc и могут собрать свое ядро с помощью pcc (это компилятор который был в BSD до 90-х годов).

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

>Идиот. Имеет значение то ОБЩЕЕ подмножество стандарта, которое поддерживается большинством популярных компиляторов. Для Си это подмножество как минимум совпадает полностью с ANSI.

у gcc можно поставить опцию он и будет поддерживать нужный стандарт/расширения, однако я не замечаю, чтобы ктото любил ограничивать возможности gcc, по моему ни кто не выставляет этих опций

>У тебя не только знания на уровне обезьяны, у тебя и интеллект не выше чем у трехлетнего шимпанзе.

для хорошего программиста больше и не надо

>ЮK&R не читал, тупица? рекомендую это, лучше чем поток сознания Страустурпа: http://www.ozon.ru/context/detail/id/85513/ однако сам не пользуюсь

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

относительно меня вы - высшая расса

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

Лиуксового ядра конечно, а netbsd просто другая тема, насколько я знаю это ядро по кроссплатформенности круче всех на свете, в смысле поддерживает больше всех аппаратных архитектур

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

> однако я не замечаю, чтобы ктото любил ограничивать возможности gcc

Большая часть кода (как минимум в open source) портабельна, и работает прекрасно и на других компиляторах (Sun, Intel, MSVC, ...). Так что не гони.

> для хорошего программиста больше и не надо

Да ну? Программист обычно решает сложные задачи. Простые задачи за него решает компьютер. Сложне же инженерные задачи ничтожествам твоего уровня решать нельзя, не осиливаете.

Нет ни одного программиста (настоящего, профессионального), кто был бы настолько туп, как ты.

> рекомендую это, лучше чем поток сознания Страустурпа

Ты идиот. Мы про СИ говорим, а ты со своим C++ лезешь.

> относительно меня вы - высшая расса

Раса с одной "с" пишется, недочеловек. И, да, конечно же относительно тебя даже необразованный, грязный дикарь будет представителем высшей расы, ты ж вообще обезьянка.

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

>Да ну? Программист обычно решает сложные задачи. Простые задачи за него решает компьютер. Сложне же инженерные задачи ничтожествам твоего уровня решать нельзя, не осиливаете.

укаждому языку - свои задачи, в любом случае код должен читаться легко и обезяннего интеллекта для этого достаточно

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

> в любом случае код должен читаться легко и обезяннего интеллекта для этого достаточно

Ты дебил. Код, конечно же, должен читаться легко. Но если для понимания смысла кода достаточно обезьяньего интеллекта - то этот код просто не нужен и бесполезен. Никаким языком не скрыть сложность реальных алгоритмов и концепций предметной области, записанных в коде. Для их понимания нужен достаточно высокий интеллект. Кто таковым не обладает, код читать и не должен, не поймет, даже если код будет на русском языке написан.

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

>Никаким языком не скрыть сложность реальных алгоритмов и концепций предметной области, записанных в коде.

не согласен, языков слишком нонго и постоянно появляются новые

Для разнообразия посмотрите стандарты языков iec1131, MatLab и т.д.

Вы предлагаете учить наизусть все стандарты? А когда же работать?

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

> не согласен, языков слишком нонго и постоянно появляются новые

Ты идиот? Вообще не понял смысла написанного выше? Повторяю для тупых - независимо от языка, алгоритмическая и концептуальная сложность будет присутствовать ВСЕГДА. Скрыть её невозможно.

> Вы предлагаете учить наизусть все стандарты? А когда же работать?

Я предлагаю, пользуясь языком, иметь под рукой его стандарт. Тогда никакие непонятные конструкции не будут вызывать затруднений.

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

>Повторяю для тупых - независимо от языка, алгоритмическая и концептуальная сложность будет присутствовать ВСЕГДА. Скрыть её невозможно.

надеюсь это было сделано совсем не с помощью злополучной запятой

>Я предлагаю, пользуясь языком, иметь под рукой его стандарт. Тогда никакие непонятные конструкции не будут вызывать затруднений.

смысл языка в том, чтобы программа легко читалась

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