Как работает функция printf в C-программировании? - PullRequest
0 голосов
/ 21 октября 2019

Я написал эту программу на C.

#include<stdio.h>
int main()
{
  int k=35;
  printf("\n%d %d %d",k==35,k=50,k>40);
  return 0;
}

и получил этот вывод.

0 50 0

Теперь я думаю окак работает функция printf и почему вывод равен 0 50 0.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Здесь есть две проблемы:

  1. Нет правила, чтобы сказать, в каком порядке оцениваются аргументы в вызове функции (например, при вызове printf). Это может быть слева направо, справа налево или какой-то другой порядок.
  2. В таком выражении, как вы оба изменяете k (k = 50) и используйте его значение (k == 35, k > 40), нет правила, чтобы сказать, используется ли старое или новое значение. (И эта неопределенность сохраняется независимо от порядка оценки.)

Из-за второй проблемы это выражение (этот вызов printf) равно undefined . Он может делать что угодно, даже что-то дико необъяснимое.

Если вы вызываете printf (или любую функцию) для аргументов, которые имеют «побочные эффекты», подобные этому (то есть, когда аргумент является чем-то вроде k = 50, который не только предоставляет значение для передачи в функцию, но также вносит некоторые другие изменения, в этом случае обновляя значение k), вам нужно разбить вещи так, чтобы поведение стало предсказуемым. В случае печати нескольких значений это просто - просто используйте несколько отдельных вызовов printf:

printf("%d ", k == 35);
printf("%d ", k = 50);
printf("%d\n", k > 40);

Теперь поведение четко определено и, вероятно, будет таким, как вы ожидали.

1 голос
/ 21 октября 2019

Вы вызываете неопределенное поведение, изменяя k и используя его значение в том же операторе перед точкой последовательности.

Хотя любой вывод является допустимым и допустимым, это возможночтобы понять, почему 0 50 0 происходит в этом случае:

Когда вызывается функция C, ее параметры могут оцениваться в любом порядке, но они часто вычисляется в обратном порядке (самый правый первый, самый левый последний).

Это не гарантировано, но часто верно.

Таким образом, 4 параметра оцениваются как:

1.) k>40 (false / 0, потому что k равно 35)
2.) k=50(назначьте 50 на k и оцените на 50)
3.) k==35 (false / 0, потому что k равно 50, а не 35)
4.) "\n%d %d %d" (строкалитерал)

Затем printf печатает свои параметры: 0, 50, 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...