Возможно, не подходит для всех случаев, но для некоторых может быть сделано просто
"12".to_i => 12
"blah".to_i => 0
.
Так что если это число, а не 0, оно вернет число. Если он возвращает 0, это либо строка слова, либо 0.
Случай 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
освобождается перед назначением нового значения.