В одном из топиков нарвался на такой код "*readBuf++". НИКОГДА ТАК НЕ ДЕЛАЙТЕ!!!
Дело в том, что операции "взять указатель" и "инкремент" имеют в языке "С" одинаковый приоритет.
А выбор кто из них выполнится первым отдается компилятору, который решает с точки зрения краткости кода и/или скорости выполнения но ни как не с точки зрения ваших подразумеваний.
Тот кто писал код подразумевал *(readBuf++) но в результате оптимизаций с вероятностью 90% , будет сгенерирован код (*readBuf)++ а это сооовсем не то чего подразумевалось. Но хуже то что это не четко, а с вероятностью. То есть при отладке может быть один код, а в релизе совершенно другой!
При использовании указателей лишних скобок не бывает!
Дело в том, что операции "взять указатель" и "инкремент" имеют в языке "С" одинаковый приоритет.
А выбор кто из них выполнится первым отдается компилятору, который решает с точки зрения краткости кода и/или скорости выполнения но ни как не с точки зрения ваших подразумеваний.
Тот кто писал код подразумевал *(readBuf++) но в результате оптимизаций с вероятностью 90% , будет сгенерирован код (*readBuf)++ а это сооовсем не то чего подразумевалось. Но хуже то что это не четко, а с вероятностью. То есть при отладке может быть один код, а в релизе совершенно другой!
При использовании указателей лишних скобок не бывает!
Последнее редактирование: