При этом используется расширение GCC, называемое операторными выражениями - так что правила специфичны для GCC (и, вероятно, эмуляции Clang GCC).
Если вы запускаете gcc -E
, вы можете увидетьчто необработанный вывод для main()
(с добавленным мной void
) равен:
# 41 "gccm43.c"
int main(void)
{
int num = 4;
if (({ int __rc = 0; int __num = (num++); printf("%s:%d: check linenum\n", __func__, 45); if (({ int __rc = 0; int __num = (__num); if (__num > 0) { printf("%s: number %d is positive\n", __func__, __num); __rc = 1; } __rc; }) && ({ int __rc = 0; int __num = (__num); if (__num / 2) { printf("%s: number %d is odd\n", __func__, __num); __rc = 1; } __rc; })) __rc = 1; __rc; }))
printf("%s: number %d is positive odd\n", __func__, num);
return 0;
}
, который при ручном форматировании (вариация на тему 'чистилища') может выглядеть следующим образом:
# 41 "gccm43.c"
int main(void)
{
int num = 4;
if (({ int __rc = 0;
int __num = (num++);
printf("%s:%d: check linenum\n", __func__, 45);
if (({ int __rc = 0;
int __num = (__num);
if (__num > 0)
{
printf("%s: number %d is positive\n", __func__, __num);
__rc = 1;
}
__rc;
}) &&
({ int __rc = 0;
int __num = (__num);
if (__num / 2)
{
printf("%s: number %d is odd\n", __func__, __num);
__rc = 1;
}
__rc;
}
))
__rc = 1;
__rc;
}
))
printf("%s: number %d is positive odd\n", __func__, num);
return 0;
}
Строки int __num = (__num);
проблематичны;Вы инициализируете переменную с самим собой, что не очень хорошо работает (значение не определено до и после инициализации).Вы также использовали (__num / 2)
, чтобы определить, является ли __num
нечетным, что является странным способом обнаружения странности;вы должны использовать (__num % 2)
.
Также теперь очевидно, почему компилятор предупреждает, что (одна из) __num
(переменные) не используется.Внешнее объявление присваивает num++
__num
, но инициализированная переменная никогда не используется, потому что внутренние вхождения int __num = (__num);
относятся к себе, а не к внешнему __num
, поэтому не used.
Вы бы лучше справились со статическими встроенными функциями - что-то вроде этого:
#include <stdio.h>
#include <stdlib.h>
static inline int num_is_positive(int num)
{
int rc = 0;
if (num > 0)
{
printf("%s: number %d is positive\n", __func__, num);
rc = 1;
}
return rc;
}
static inline int num_is_odd(int num)
{
int rc = 0;
if (num % 2) // BUG fixed
{
printf("%s: number %d is odd\n", __func__, num);
rc = 1;
}
return rc;
}
static inline int num_is_positive_odd(int num)
{
int rc = 0;
printf("%s:%d: check linenum\n", __func__, __LINE__);
if (num_is_positive(num) && num_is_odd(num))
rc = 1;
return rc;
}
int main(void)
{
int num = 4;
if (num_is_positive_odd(num++))
printf("%s: number %d is positive odd\n", __func__, num);
return 0;
}