В C и C ++ это выражение, использующее оператор запятой, такой как & ldquo; a = b, ++ a; & rdquo; не определено?

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

"12".to_i   => 12
"blah".to_i => 0

.

Так что если это число, а не 0, оно вернет число. Если он возвращает 0, это либо строка слова, либо 0.

22
задан dbush 3 May 2018 в 19:15
поделиться

1 ответ

Случай 3 хорошо определен.

Раздел 6.5.17 стандарта C , касающийся оператора запятой ,, говорит следующее:

2 Левый операнд оператора запятой оценивается как пустое выражение; Существует точка последовательности между его оценкой и оценкой правого операнда. Затем вычисляется правый операнд; результат имеет свой тип и значение

Раздел 5.14 p1 стандарта C ++ 11 имеет похожий язык:

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

Из-за точки последовательности, a = b + a гарантированно будет полностью оценена до a++ в выражении a = b + a, a++.

Что касается free(foo), foo = bar, это также гарантирует, что foo освобождается перед назначением нового значения.

38
ответ дан dbush 3 May 2018 в 19:15
поделиться