Раздел 6.6/3
, «Константные выражения», стандарта ISO C99 - это раздел, который вам нужен. В нем говорится:
Постоянных выражения не должны содержать назначение, увеличение, уменьшение, вызов функции, или запятую операторы, кроме случаев, когда они содержатся в подвыражения, который не оценки.
В обосновании документа C99 от ISO, есть этот маленький фрагмент кода:
Целочисленные константное выражение должно включать только числа познаваемых во время трансляции, а операторы без побочных эффектов.
И, так как нет смысла использовать оператор запятой на всех если вы не полагаться на побочные эффекты, это бесполезно в постоянном выражении.
Под этим я имею в виду, что нет абсолютно никакой разницы между двумя сегментами кода:
while (10, 1) { ... }
while (1) { ... }
с 10
фактически не делать ничего. На самом деле,
10;
это вполне допустимо, хотя и не очень полезно, заявление C, то большинство людей не понимают, пока они не получат, чтобы лучше знать язык.
Однако есть есть разница между этими двумя утверждениями:
while ( 10, 1) { ... }
while (x=10, 1) { ... }
Там побочный эффект в последнем использовании оператора запятая, который должен установить переменную x
в 10
.
Относительно того, почему они не любят побочные эффекты в постоянных выражениях, вся точка постоянных выражений заключается в том, что их можно оценивать во время компиляции, не требуя среды выполнения. - ISO делает различие между трансляцией (время компиляции) и среды исполнения (времени выполнения).
Разгадка, почему ISO передумала требует составителей для предоставления информации среды исполнения (кроме материала, содержащегося в заголовочных файлах, таких как limits.h
) можно найти чуть позже в обоснование документа:
Однако, в то время как реализациям, конечно же, разрешено производить точно такой же результат в средах перевода и исполнения, что требовало, чтобы это было невыносимым бременем для многих кросс-компиляторов.
Иными словами, ИСО не хотел, чтобы производители кросс-компиляторов были обременены переносом среды выполнения для всех возможных целей.
Спасибо Rossel. Теперь текст имеет большую читаемость. –
Возможный дубликат [Что делает оператор запятой \ ', \' do in C?] (Http://stackoverflow.com/questions/52550/what-does-the-comma-operator-do-in-c) –