C оператор запятой

Ссылка NilObject привела меня к большому сообщению в блоге Кетчуп на Вашем Значке в makentosh.com

... Конечно, со всем этим несоответствием нужно было иметь дело в конечном счете, правильно? Хорошо 2.0 имел дело с ним прекрасным способом! Наконец 57x57 на самом деле предназначенный 57x57.

... каждый пиксель... представленный отлично.

15
задан Community 23 May 2017 в 12:08
поделиться

4 ответа

Раздел 6.6 / 3 , «Постоянные выражения», стандарта ISO C99 - это тот раздел, который вам нужен. В нем говорится:

Выражения констант не должны содержать присваивание, приращение, декремент, вызов функции, или операторы запятой, кроме случаев, когда они содержатся в подвыражении, которое не

В документе с обоснованием C99 от ISO есть этот небольшой фрагмент:

Целочисленное постоянное выражение должно включать только числа, известные во время перевода, и операторы без побочных эффектов.

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

Под этим я подразумеваю, что нет абсолютно никакой разницы между двумя сегментами кода:

while (10, 1) { ... }
while     (1) { ... }

, поскольку 10 на самом деле ничего не делает . На самом деле,

10;

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

Однако есть разница между этими двумя утверждениями:

while (  10, 1) { ... }
while (x=10, 1) { ... }

Там '

33
ответ дан 1 December 2019 в 01:17
поделиться

ISO / IEC 9899: 1999 6.6 / 3 (Постоянные выражения) утверждает, что сопутствующие выражения должны не содержать операторов запятой (если только часть подвыражения не вычисляется), поэтому (10,20) не является постоянным выражением по определению.

Обоснование должно заключаться в том, что значение в первой части выражения-запятой не используется, оно используется только для побочных эффектов, и для константных выражений нет смысла иметь побочные эффекты.

6
ответ дан 1 December 2019 в 01:17
поделиться

gcс принимает это:

int a = (10,20) ;

int main() {
  printf("%d\n",a);
}

и печатает 20 . Может, проблема в вашем компиляторе?

-2
ответ дан 1 December 2019 в 01:17
поделиться

Компилятор не считает это постоянным выражением, поскольку переменная является автоматической. Допускается оценка во время выполнения и получение значения. Попробуйте сделать переменную статической, и вы увидите то же сообщение об ошибке, поскольку компилятору в этот раз потребуется постоянное выражение.

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

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

0
ответ дан 1 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: