У меня не просто ощущение, я на все 100% уверен, что некоторые не понимают даже что такое синтаксический сахар
У меня не просто ощущение, я на все 100% уверен, что некоторые не понимают даже что такое синтаксический сахар
Под «синтаксическим сахаром» понимается любой имеющийся в языке программирования синтаксический элемент, механизм, способ описания, который дублирует другой, имеющийся в языке элемент или механизм, но является более удобным в использовании, или более краток, или выглядит естественнее, или более привычен (похож на аналогичные элементы других языков), или просто лучше воспринимается при чтении программы человеком. Принципиально то, что синтаксический сахар, теоретически, всегда можно удалить из языка без потери его возможностей — всё, что можно написать с применением синтаксического сахара, может быть написано на этом же языке и без него. Таким образом, синтаксический сахар предназначен лишь для того, чтобы сделать более удобным для программиста написание программы.
Например, в языке C и его потомках имеются операторы увеличения и уменьшения (++, --, +=, -= и т. п.). Введение этих операторов в язык было вызвано необходимостью поддержки ручной оптимизации программ, так как код с их использованием мог транслироваться в более эффективные машинные команды («++a» транслировалось в одну команду INC, а аналогичное выражение «a=a+1» — в целую группу команд). Развитие технологии оптимизации кода сделало подобную ручную оптимизацию бессмысленной; сейчас компиляторы порождают одинаковый код для «длинного» и «короткого» варианта операции. В результате сокращённые операторы превратились в синтаксический сахар, хотя изначально им не были.
Код: Выделить всё
typedef enum {
north = 0,
east = 1,
south =2,
west =3}
Код: Выделить всё
int rotate(int olddir, int angle){
olddir += angle;
olddir %= 4;
if(olddir < 0) olddir += 4;
return olddir;
}
Код: Выделить всё
#define DIRECTION_NORD 0
#define DIRECTION_EAST 1
#define DIRECTION_SOUTH 2
#define DIRECTION_WEST 3
typedef struct directions_st {
uint8_t direction:2;
} directions_t;
directions_t rotate(directions_t dir, int8_t angle){
dir.direction+=angle;
return dir;
}
Код: Выделить всё
#define DIRECTION_NORD 0
#define DIRECTION_EAST 1
#define DIRECTION_SOUTH 2
#define DIRECTION_WEST 3
#define DIRECTION_STEP_LEFT(d) d.direction--
#define DIRECTION_STEP_RIGHT(d) d.direction++
typedef struct directions_st {
uint8_t direction:2;
} directions_t;
Код: Выделить всё
typedef enum { north, east, south, west } Dir;
Dir dir = 555;
dir /= 111;
Код: Выделить всё
arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -DUSE_FULL_LL_DRIVER -DSTM32F103xB -D_STM32F1 -D_ILI9341 -D_DISP_SPI -D_DISP_320x240 -D_TDA7439 -D_TDA731X -D_PT232X -D_TDA7418 -D_RDA580X -D_SI470X -D_TEA5767 -Idisplay -Iusb -Idrivers/STM32F1xx_HAL_Driver/Inc -Idrivers/STM32_USB_Device_Library/Core/Inc -Idrivers/CMSIS/Device/ST/STM32F1xx/Include -Idrivers/CMSIS/Include -Isystem -Os -fshort-enums -ffunction-sections -fdata-sections -ffreestanding -Wall -Werror -g -gdwarf-2 -MMD -MP -MT build/main.o -MF build/./main.d -DUSE_FULL_LL_DRIVER -DSTM32F103xB -D_STM32F1 -D_ILI9341 -D_DISP_SPI -D_DISP_320x240 -D_TDA7439 -D_TDA731X -D_PT232X -D_TDA7418 -D_RDA580X -D_SI470X -D_TEA5767 -o build/main.o main.c
main.c: In function 'main':
main.c:112:15: error: unsigned conversion from 'int' to 'Dir' {aka 'enum <anonymous>'} changes value from '555' to '43' [-Werror=overflow]
Dir dir = 555;
^~~
cc1: all warnings being treated as errors