Как работает разделение запятыми при объявлении переменных - PullRequest
2 голосов
/ 18 марта 2019

Однажды я допустил ошибку в своем коде, когда забыл завершить инициализацию переменной точкой с запятой и вместо этого поставил запятую. Однако, к моему удивлению, он никогда не возвращал ошибку, и код работал как обычно.

Поэтому мне было интересно, как это работает? Я упростил свой код, написав следующий код:

uint32_t randomfunction_wret()
{
  printf("(%d:%s) - \n", __LINE__, __FILE__);
  return 6;
}

uint32_t randomfunction()
{
  printf("(%d:%s) - \n", __LINE__, __FILE__);
}

int main()
{
    uint32_t val32 = 3, randomfunction_wret(), valx = 6, randomfunction();

    printf("(%d:%s) - %u %u\n", __LINE__, __FILE__, val32, valx);

   return 0;
}

При выполнении возвращается;

(43:test.c) - 3 6

Я очень шокирован тем, что нет ошибок, когда у меня есть функции, разделенные в моей инициализации. Однако функции даже не вызывались.

============== ОБНОВЛЕНО

Как насчет того, чтобы код был следующим, из того, что я вижу, теперь вызывается каждая функция;

int main()
{
    uint32_t val32;

    val32 = 3, randomfunction_wret(), randomfunction();

    printf("(%d:%s) - %u \n", __LINE__, __FILE__, val32);

   return 0;
}

Вывод будет

(23:test.c) - 
(29:test.c) - 
(38:test.c) - 3 

1 Ответ

10 голосов
/ 18 марта 2019

Линия

uint32_t val32 = 3, randomfunction_wret(), valx = 6, randomfunction();

эквивалентно;

uint32_t val32 = 3;                // Defines and initializes the variable.
uint32_t randomfunction_wret();    // Re-declares the function. Nothing else is done.
uint32_t valx = 6;                 // Defines and initializes the variable.
uint32_t randomfunction();         // Re-declares the function. Nothing else is done.

Переменные, используемые в функции, правильно определены и инициализированы. Следовательно, функция работает без проблем.


Кроме того, реализация randomfunction() не имеет оператора return. Его использование приведет к неопределенному поведению.


Обновление, в ответ на отредактированное сообщение.

Из-за приоритета оператора , строка

val32 = 3, randomfunction_wret(), randomfunction();

эквивалентно:

(val32 = 3), randomfunction_wret(), randomfunction();

Все подвыражения выражения, разделенного запятыми, оцениваются. Следовательно, функции randomfunction_wret и randomfunction вызываются, а их возвращаемые значения отбрасываются.

...