Довольно часто при делении целых чисел надо получить не только их частное, но и остаток деления.
Приходится писать что-то вроде:
// . . .
int x = a / b;
int y = a % b;
// . . .
Процессоры i386+ находят оба значения за одну (довольно сложную, дорогостоящую) инструкцию, но у компиляторов не всегда есть все необходимые данные для разбора таких случаев. В результате может сгенерироваться примерно следующий код:
; Оптимизирующий компилятор Microsoft (R) C/C++ версии 19.31.31105 для x86 с флагами /EHs /O2
; . . .
mov eax, ecx
cdq
idiv esi
mov BYTE PTR _buf$[esp+12], al
mov eax, ecx
cdq
idiv esi
mov BYTE PTR _buf$[esp+13], dl
; . . .
Процессор дважды считает одну инструкцию, а программисты пишут две почти одинаковых строчки кода.
Обе проблемы можно решить добавлением нового тернарного оператора. Вот пример возможного синтаксиса:
int y, x = a / b : y;
Это позволит нам писать более простой и понятный код, а компиляторам - быть немного оптимальней.
исходный код примера:
# include <Windows.h>
int main() {
int* a = new int{10};
int* b = new int{3};
int c = *a / *b;
int d = *a % *b;
char buf[2];
buf[0] = '0' + c;
buf[1] = '0' + d;
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsole(stdout, buf, 2, nullptr, NULL);
}
Довольно часто при делении целых чисел надо получить не только их частное, но и остаток деления. Приходится писать что-то вроде:
Процессоры i386+ находят оба значения за одну (довольно сложную, дорогостоящую) инструкцию, но у компиляторов не всегда есть все необходимые данные для разбора таких случаев. В результате может сгенерироваться примерно следующий код:
Процессор дважды считает одну инструкцию, а программисты пишут две почти одинаковых строчки кода. Обе проблемы можно решить добавлением нового тернарного оператора. Вот пример возможного синтаксиса:
Это позволит нам писать более простой и понятный код, а компиляторам - быть немного оптимальней.
исходный код примера: