|
|
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SS ©ISO/IEC ISO/IEC 9899:201x 6.2.5 20 — A function type describes a function with specified return type. A function type is characterized by its return type and the number and types of its parameters. A function type is said to be derived from its return type, and if its return type is T, the function type is sometimes called ‘‘function returning T’’. The construction of a function type from a return type is called ‘‘function type derivation’’. — A pointer type may be derived from a function type or an object type, called the referenced type. A pointer type describes an object whose value provides a reference to an entity of the referenced type. A pointer type derived from the referenced type T is sometimes called ‘‘pointer to T’’. The construction of a pointer type from a referenced type is called ‘‘pointer type derivation’’. A pointer type is a completeobject type. White Owl"это называется ссылочным типом". Указатель может быть на объект или на функцию - это ссылочный тип. До своего варианта перевода, я перевёл так-же. Но pointer type и refereced type выделены курсивом, и я подумал, маловероятно этот перевод верный. Видимо ошибся. про void. 1. если я знаю что функция не будет (и не должна) принимать никакие параметры, как правильно будет выглядеть её прототип ? 2. В каких случаях нельзя обойтись без void ? Используете ли вы его ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2014, 03:21:43 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Переводить "the referenced type" как "ссылочный тип" некорректно, т.к. тут имеется в виду другое - "тот тип на который ссылаются" (к сожалению не могу подобрать короткий русский аналог). А "ссылочный тип" - это тип хранящий ссылку, "reference type" (без "d"). Таких в С нет. SashaMercury1. если я знаю что функция не будет (и не должна) принимать никакие параметры, как правильно будет выглядеть её прототип ? У нас тут что, справочная что-ли? Зачем задавать на форуме тривиальные вопросы? :) Код: plaintext 1. SashaMercury2. В каких случаях нельзя обойтись без void ? Используете ли вы его ? void применяется когда либо нет значения либо тип значения неизвестен или не важен. Например, cтандартная ф-я memcpy может копировать память независимо от типа данных расположенных в ней, поэтому тип не указывают, а используют указатели на void Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2014, 04:15:27 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, спасибо ) Постараюсь уменьшить количество тривиальных вопросов. Кстати, сейчас правильно Anatoly MoskovskyНапример, cтандартная ф-я memcpy может копировать память независимо от типа данных расположенных в ней, поэтому тип не указывают, а используют указатели на void Код: plaintext 1. Вот так только вроде :) Код: plaintext 1. 2. Сегодня наткнулся на вот что : ©ISO/IEC ISO/IEC 9899:201x 5.2.4.1 Translation limits 1 The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:18) — 127 nesting levels of blocks — 63 nesting levels of conditional inclusion — 12 pointer, array, and function declarators (in any combinations) modifying an arithmetic, structure, union, or void type in a declaration — 63 nesting levels of parenthesized declarators within a full declarator — 63 nesting levels of parenthesized expressions within a full expression — 63 significant initial characters in an internal identifier or a macro name (each universal character name or extended source character is considered a single character) ... Имеют ввиду что хотя бы один из перечисленных экземпляров должен быть ограничен сверху заданными параметрами ? Если так, то почему так ? Странная реализация, логично было бы накладывать предел сверху на каждый параметр. Потому я вероятно что-то не так понял с переводом. А если я не так понял с переводом, то почему всего 12 указателей ? Это так мало может быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2014, 03:53:57 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Там пишут что компилятор должен уметь компилировать любую программу в которой встречаются каждый из перечисленных лимитов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2014, 14:55:28 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SashaMercuryто почему всего 12 указателей Не 12 указателей, а 12 уровней вложенности указателей. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2014, 15:03:21 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Понял, спасибо :-) а почему именно 12 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2014, 17:25:23 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПонял, спасибо :-) а почему именно 12 ?Чтобы жизнь медом не казалась! Я знаю зачем может понадобиться указатель на указатель, но нужность трехуровневого указателя уже вызывает у меня сомнения. Ну а уж больше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2014, 18:09:17 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Там не только про указатели, но и сочетания указателей, функций и массивов в одной декларации. Вполне могут встречаться кострукции вида "указатель на ф-ю, возвращающуюю указатель на массив указателей". Тут уже 4 уровня вложенности: указатель - ф-я - массив - указатель. Скорее всего в каком-то реальном проекте встретилось 6 уровней, вот в стандарте взяли с запасом в 2 раза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2014, 23:04:09 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТам не только про указатели, но и сочетания указателей, функций и массивов в одной декларации. Вполне могут встречаться кострукции вида "указатель на ф-ю, возвращающуюю указатель на массив указателей". Тут уже 4 уровня вложенности: указатель - ф-я - массив - указатель.Не, функция тут не будет указателем. Как я понимаю, ты намекаешь на код типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Три уровня у f. Но мне все равно не очень верится что подобное может понадобится в реальном проекте. Уж слишком это заморочено и неудобно. А уж поддержка и изменение этого вообще кошмаром будет. Anatoly MoskovskyСкорее всего в каком-то реальном проекте встретилось 6 уровней, вот в стандарте взяли с запасом в 2 раза.Мне больше кажется, что это они сделали широкий жест: "нате подавитесь". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2014, 00:16:55 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Three Star Programmer A rating system for C-programmers. The more indirect your pointers are (i.e. the more "*" before your variables), the higher your reputation will be. No-star C-programmers are virtually non-existent, as virtually all non-trivial programs require use of pointers. Most are one-star programmers. In the old times (well, I'm young, so these look like old times to me at least), one would occasionally find a piece of code done by a three-star programmer and shiver with awe. Some people even claimed they'd seen three-star code with function pointers involved, on more than one level of indirection. Sounded as real as UFOs to me. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2014, 00:35:23 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Везде максимум имеет формат 2^n-1, а тут нет. Вот я и удивился ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2014, 16:33:32 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Я анализировал один код, позже приведу его полностью. Встретил оператор switch и интересный комментарий: falls through. С этим я разобрался, и решил разобраться с ним полностью, почитал стандарт. ©ISO/IEC ISO/IEC 9899:201x 6.8.4.2 The switch statement Constraints 1 The controlling expression of a switch statement shall have integer type. 2 If a switch statement has an associated case or default label within the scope of an identifier with a variably modified type, the entire switch statement shall be within the scope of that identifier.154) 3 The expression of each case label shall be an integer constant expression and no two of the case constant expressions in the same switch statement shall have the same value after conversion. There may be at most one default label in a switch statement. (Any enclosed switch statement may have a default label or case constant expressions with values that duplicate case constant expressions in the enclosing switch statement.) Semantics 4 Aswitch statement causes control to jump to, into, or past the statement that is the switch body, depending on the value of a controlling expression, and on the presence of a default label and the values of any case labels on or in the switch body. A case or default label is accessible only within the closest enclosing switch statement. 5 The integer promotions are performed on the controlling expression. The constant expression in each case label is converted to the promoted type of the controlling expression. If a converted value matches that of the promoted controlling expression, control jumps to the statement following the matched case label. Otherwise, if there is a default label, control jumps to the labeled statement. If no converted case constant expression matches and there is no default label, no part of the switch body is executed. EXAMPLE In the artificial program fragment Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. the object whose identifier is i exists with automatic storage duration (within the block) but is never initialized, and thus if the controlling expression has a nonzero value, the call to the printf function will access an indeterminate value. Similarly, the call to the function f cannot be reached. 1. Почему нельзя использовать тип float ? Связано с точностью сравнения ? 2. 2 пункт перевода вообще не понял. Подскажите пожалуйста о чём идёт речь. Вероятно что-то очень банальное, мне так кажется. 3. В третьем пункте идёт фраза "after conversion", я так понял после integer promotion ? 4. 3pAny enclosed switch statement may have a default label or case constant expressions with values that duplicate case constant expressions in the enclosing switch statement Любой оператор switch может иметь метку default или case со значениями дублирующими..другой switch ? Это хотят сказать ? 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 5.1 константа 1 конвертируется к int ? Согласно пункту 5. 5.2 p5If a converted value matches that of the promoted controlling expression, control jumps to the statement following the matched case label. Otherwise, if there is a default label, control jumps to the labeled statement. If no converted case constant expression matches and there is no default label, no part of the switch body is executed. Не очень понял перевод. Подскажите пожалуйста. 6. Ну и код. Я собственно не поверил, и проверил Код: plaintext 1. 2. 3. 4. 5. 6. 6.1 Так и оказалось, фиг с маслом а не printf. Тогда почему компилятор не ругнулся ? 6.2 Есть ли вообще смысл такхи вот строчек в операторе switch? 6.3 Ну вот это never initialized меня вообще удивило, как такое может быть ? Я ведь чётко присвоил ей значение. 7. Почему оператор switch принимает не адрес объекта ? Исходя из логики работы должен быть указатель. Или тут что-то скрыто ? 8. Два участка кода, и один вы уже видели: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Что будет на выходе ? 5. Дальше, вы не поверите сказал бы я человеку изучавшему Си один день, но вы то знаете: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Что и тут на выходе 5. Что в стандарте я упустил, где написано что он должен работать так ? Мало того Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. На выходе вы конечно знаете что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2014, 05:01:26 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. А это сможете объяснить как работает? Например, к чему относится break - к case 2 или while? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2014, 05:40:22 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Я уже с телефона, не могу проверить.Но мне кажется что к case 1. То есть этот break не выполнится. Очень не уверен, switch ранее в Си не использовал. Но ваш пример мне нравится :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2014, 06:18:10 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SashaMercuryДальше, вы не поверите сказал бы я человеку изучавшему Си один день, но вы то знаете: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Что и тут на выходе 5. Что в стандарте я упустил, где написано что он должен работать так ? Вы упустили, что аргумент switch проверяется однократно, на входе в switch, потом делается переход на метку соответствующую этой проверке, далее код просто выполняется пока не встретится break или } (относящиеся к этому switch). Все встретившиеся по пути метки case/default игнорируются. SashaMercury6. Ну и код. Я собственно не поверил, и проверил Код: plaintext 1. 2. 3. 4. 5. 6. 6.1 Так и оказалось, фиг с маслом а не printf. Тогда почему компилятор не ругнулся ? switch это синтаксический сахар над if и goto. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Эквивалентный (почти) код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Таким образом код до case никогда не выполняется. Более того, так как case это по сути обычная метка, то переход на нее, пропускает код инициализации локальных переменных объявленных в switch, поэтому все переменные объявленные там остаются неинициализированными. Чтобы этого не было, нужно после case открыть вложеный блок {} и объявлять переменные в нем. (Каждый вложенный блок имеет собственный код инициализации переменных ) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2014, 17:09:42 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SashaMercuryНо мне кажется что к case 1 Нет. Еще варианты? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2014, 17:10:43 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Очень интересно. Я думаю что относится к case 2. Хотя я в этом не уверен. Но мне кажется что связывание с этим case должно происходить. Тут для меня скорее другой вопрос. Произойдёт ли переход на case 2 ? Точнее произойдёт ли он только в том случае если на входе будет 1, или будет видна метка 2 вложенная в 1. Я решил что про вложенность меток я ничего не читал, и не знаю. Потому скорее всего такой вложенности быть не может. Потому произойдёт прямой переход на case 2, break будет относиться к нему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 07:01:40 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Вы упустили, что аргумент switch проверяется однократно, на входе в switch, потом делается переход на метку соответствующую этой проверке, далее код просто выполняется пока не встретится break или } (относящиеся к этому switch). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Но тогда что будет в этом коде ? Выполнится case 1, затем, дефолт, а дальше произойдёт возврат к p1, и дважды будет происходить инкремент ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 07:05:36 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SSНо тогда что будет в этом коде ? Выполнится case 1, затем, дефолт, а дальше произойдёт возврат к p1, и дважды будет происходить инкремент ? Совсем дурной, он встретит case 1,и далее сделает 4 инкремента. falls through Тут я понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 07:47:31 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
три* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 07:48:09 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
SashaMercuryтри*четыре. default тоже выполнится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2014, 12:53:24 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
egorych, я понял ) Имел ввиду "кроме case 1 " ещё три инкремента. Anatoly Moskovsky, как правильно рассуждать отвечая на ваш вопрос ? Какой правильный ответ ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 01:56:31 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. А это сможете объяснить как работает? Например, к чему относится break - к case 2 или while? :) SashaMercuryAnatoly Moskovsky, как правильно рассуждать отвечая на ваш вопрос ? Какой правильный ответ ? Рассуждать так. break прерывающий switch относится не к case, а к switch в целом, а case это просто метка, у нее нет семантики прерывания. Теперь, если у нас перемешаны switch и while, то break относится к ближайшему из них по вложенности. Таким образом не смотря на то что break ближе к case, относится он к while, т.к. switch дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 04:04:28 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Рассуждать так. break прерывающий switch относится не к case, а к switch в целом, а case это просто метка, у нее нет семантики прерывания. Теперь, если у нас перемешаны switch и while, то break относится к ближайшему из них по вложенности. Таким образом не смотря на то что break ближе к case, относится он к while, т.к. switch дальше. Спасибо.Здорово. Мне очень нравится эта логика языка. Обидно что я всё это знал,(тем более после того когда вы мне объяснили что case это всего лишь метка кода), и не смог сделать выводы самостоятельно :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 04:17:08 |
|
||
|
INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:201x Вопросы и комментарии
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Продолжил изучать fopen. У меня возникли следующие вопросы. Подскажите пожалуйста по ним. 1. ©ISO/IEC ISO/IEC 9899:201x page 122 The intended use of the restrict qualifier (like the register storage class) is to promote optimization, and deleting all instances of the qualifier from all preprocessing translation units composing a conforming program does not change its meaning (i.e., observable behavior). Данный квалификатор необходим для оптимизации работы препроцеесора ? Т.е. препроцессор данный квалификатор и объекты связанные с ним никаким образом не меняет. Тогда странно, я бы сравнил его не с классом памяти register, а с квалификатором volatile. 2. ©ISO/IEC ISO/IEC 9899:201x 6.7.3.1 Formal definition of restrictLet D be a declaration of an ordinary identifier that provides a means of designating an object P as a restrict-qualified pointer to type T. 2 IfD appears inside a block and does not have storage class extern, let B denote the block. If D appears in the list of parameter declarations of a function definition, let B denote the associated block. Otherwise, let B denote the block of main (or the block of whatever function is called at program startup in a freestanding environment). 3 In what follows, a pointer expression E is said to be based on object P if (at some sequence point in the execution of B prior to the evaluation of E) modifying P to point to a copy of the array object into which it formerly pointed would change the value of E.137) Note that ‘‘based’’ is defined only for expressions with pointer types. Первый и второй раздел мне понятны. Первый: D is expr: T* restrict p; И второй говорит о том где расположено выражение D. Подскажите как перевести третий, без него я не смогу понять что дальше. 3. Часто ли вы пользуетесь данным квалификатором ? Насколько он важен ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2014, 06:23:04 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38658212&tid=2018847]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
185ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 485ms |

| 0 / 0 |
