Ссылка NilObject привела меня к большому сообщению в блоге Кетчуп на Вашем Значке в makentosh.com
... Конечно, со всем этим несоответствием нужно было иметь дело в конечном счете, правильно? Хорошо 2.0 имел дело с ним прекрасным способом! Наконец 57x57 на самом деле предназначенный 57x57.
... каждый пиксель... представленный отлично.
Раздел 6.6 / 3
, «Постоянные выражения», стандарта ISO C99 - это тот раздел, который вам нужен. В нем говорится:
Выражения констант не должны содержать присваивание, приращение, декремент, вызов функции, или операторы запятой, кроме случаев, когда они содержатся в подвыражении, которое не
В документе с обоснованием C99 от ISO есть этот небольшой фрагмент:
Целочисленное постоянное выражение должно включать только числа, известные во время перевода, и операторы без побочных эффектов.
И, поскольку в этом нет смысла. при использовании оператора запятой вообще , если вы не полагаетесь на побочные эффекты, он бесполезен в постоянном выражении.
Под этим я подразумеваю, что нет абсолютно никакой разницы между двумя сегментами кода:
while (10, 1) { ... }
while (1) { ... }
, поскольку 10
на самом деле ничего не делает . На самом деле,
10;
является вполне допустимым, хотя и не очень полезным, оператором C, чего большинство людей не поймут, пока не узнают язык лучше.
Однако есть разница между этими двумя утверждениями:
while ( 10, 1) { ... }
while (x=10, 1) { ... }
Там '
ISO / IEC 9899: 1999 6.6 / 3 (Постоянные выражения) утверждает, что сопутствующие выражения должны не содержать операторов запятой (если только часть подвыражения не вычисляется), поэтому (10,20)
не является постоянным выражением по определению.
Обоснование должно заключаться в том, что значение в первой части выражения-запятой не используется, оно используется только для побочных эффектов, и для константных выражений нет смысла иметь побочные эффекты.
gcс принимает это:
int a = (10,20) ;
int main() {
printf("%d\n",a);
}
и печатает 20
. Может, проблема в вашем компиляторе?
Компилятор не считает это постоянным выражением, поскольку переменная является автоматической. Допускается оценка во время выполнения и получение значения. Попробуйте сделать переменную статической, и вы увидите то же сообщение об ошибке, поскольку компилятору в этот раз потребуется постоянное выражение.
Допускается оценка во время выполнения и получение значения. Попробуйте сделать переменную статической, и вы увидите то же сообщение об ошибке, поскольку компилятору в этот раз потребуется постоянное выражение. Допускается оценка во время выполнения и получение значения. Попытайтесь сделать переменную статической, и вы увидите то же сообщение об ошибке, поскольку в этот раз компилятору потребуется постоянное выражение.