Порядок указания, что операнды вычисляются в c
Заявление puts("a") + puts("b")
не определено Это связано с тем, что в Стандарте C не указано, должны ли они выполняться слева направо или справа налево, чтобы вы могли получить
a
b
или же
b
a
Есть ли чистый способ диктовать порядок операций в выражении?
Единственное, о чем я могу думать, - это использовать сложное утверждение, такое как
({
int temp = puts("a");
temp += puts("b");
temp;
})
хотя это непереносимо и немного дольше, чем я надеялся.
Как это может быть достигнуто лучше всего?
2 ответа
Если вы объявите int
Переменная перед выражением, вы можете принудительно упорядочить порядок с помощью оператора запятой при вычислении суммы внутри выражения:
int temp;
...
(temp = puts("a"), temp + puts("b"))
Как указано в стандарте C:
6.5.17 Запятая
Синтаксис
expression: assignment-expression expression , assignment-expression
Семантика
Левый операнд оператора запятой оценивается как пустое выражение; существует последовательность между его оценкой и оценкой правого операнда. Затем вычисляется правый операнд; результат имеет свой тип и значение.
Обратите внимание, что значение выражения не будет очень полезным, учитывая семантику puts()
, как прокомментировал Джонатан Леффлер.
Единственный способ навязать порядок оценки - использовать отдельные утверждения. Компиляторы могут использовать любой порядок, который будет сочтен необходимым. Так что для вызовов функций f1() + f2() + f3(); любой из этих вызовов функций может быть вызван раньше другого. Единственное влияние, которое вы можете оказать на это утверждение, заключается в том, что делать с возвратами из этих функций. Короче говоря, просто используйте отдельные утверждения. Скорее всего, что бы вы ни делали, размещение вызовов в цикле должно работать хорошо.
Достойная ссылка: http://en.cppreference.com/w/c/language/eval_order