Порядок указания, что операнды вычисляются в 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

Другие вопросы по тегам