Я читаю конец 2-й главы K & R, и у меня возникают трудности с пониманием двух конкретных не связанных между собой примеров строк кода (которые следуют) вместе с комментариями к ним в книге:
x = f() + g();
a[i] = i++;
ПЕРВАЯ ЛИНИЯ - у меня нет проблем с пониманием того, что в стандарте не указан порядок оценки для оператора +
, и, следовательно, не определено, выполняет ли сначала f()
или g()
оценку (и что Вот почему я думаю, что вопрос не является дубликатом). Моя путаница проистекает из того факта, что если мы посмотрим на диаграмму приоритета оператора C C operator precedence chart, то в ней будут приведены вызовы функций с наивысшим приоритетом с ассоциативностью слева направо. Не значит ли это, что f()
должен вызывать/оценивать до g()
? Очевидно, нет, но я не знаю, чего мне не хватает.
ВТОРАЯ ЛИНИЯ - Снова похожая головоломка, касающаяся того, индексирован ли массив к начальному значению i
или увеличенному значению. Однако опять-таки в диаграмме приоритетов операторов цитирование массивов имеет наивысший приоритет с ассоциативностью слева направо. Следовательно, не будет ли в первую очередь оцениваться подписка на массив, в результате чего массив будет подписан на начальное значение i
и устранена какая-либо однозначность? Очевидно, нет, и я что-то упускаю.
Я понимаю, что у компиляторов есть свобода решать, когда в выражении возникают побочные эффекты (между точками последовательности, конечно) и что это может вызвать неопределенное поведение, если рассматриваемая переменная снова используется в том же выражении, однако в приведенных выше примерах Кажется, что любая неоднозначность устраняется вызовами функций и подпиской массива, имеющей наивысший приоритет и определяемой ассоциативностью слева направо, поэтому я не вижу неоднозначности.
У меня есть ощущение, что у меня есть фундаментальное неправильное представление о понятиях ассоциативности, приоритета операторов и порядка оценки, но я не могу указать пальцем на то, что это такое, и подобные вопросы/ответы по этой теме были вне моей лиги понять полностью в этом пункте.