2013-11-22 3 views
-1

Мой код:Невозможно понять выход C progaram

#include<stdio.h> 
int main() 
{ 
    char c='8'; 
    int d=8; 
    printf("%d %d %d",d,d+=c>='0'&&c<='9',c++); 
    return(0); 
} 

Выход этого вопроса: 9 9 56. Я не могу этого понять. Пожалуйста, помогите мне, пожалуйста, объясните мне результат. Спасибо.

+0

Это странно! –

+0

char '8' -' 56' в десятичной системе. Другая часть хорошо справляется с упомянутым выше вопросом. – devnull

+3

Соревнуетесь ли вы в конкурсе по запуску кода или пытаетесь понять порядок работы? – vextorspace

ответ

2

в основном Printf читает аргумент справа налево, так что первая печать будет из

" printf("%d %d %d",d,d+=c>='0'&&c<='9',c++); " 

- 1st output = c++ -> which is nothing but ascii value of '8' = 56 
    and then c is incremented by 1 . 

- next is the d -> it boils down to d = d + if(c>='0'&&c<='9') ... 
    so d = d+1 so 9 here 

- next d again so it is again Hope it is clear ! 
+0

@ Srikanth, Спасибо за ответ –

+0

-1, * printf читает аргумент справа налево * неверно, http://stackoverflow.com/a/9566538/2327831 – this

+0

Хорошо, я исправляю свой статус. Вывод может отличаться от компилятора к компилятору. Но в этом конкретном сценарии он читал справа налево, и поэтому мы могли видеть это поведение. В другой день в другом компиляторе это может быть совершенно иначе. – Srikanth

5

Вы наблюдаете неопределенное поведение. d передается как аргумент дважды, и один раз с побочными эффектами. Если все сделано в последовательности код должен быть эквивалентен

char c='8'; 
int d=8; 
printf("%d",d); 

d+= (c>='0)' && (c<='9'); 
printf(" %d", d); 
printf(" %d",c); 
c++; 

Но так как это не определено, в каком порядке аргументы вычисляются при передаче их с побочными эффектами на функцию вы видите здесь:

char c='8'; 
int d=8; 

d+= (c>='0)' && (c<='9'); 
printf("%d",d); 
printf(" %d", d); 
printf(" %d",c); 
c++; 
+0

Не определено? [Список точек последовательности] (http://stackoverflow.com/questions/3575350/sequence-points-in-c), по-видимому, предполагает, что аргументы оцениваются * перед * вызовом функции. – Gaminic

+2

@Gaminic порядок, в котором оцениваемые параметры не определены – Deepthought

+0

Да, но в этом случае «нечетная печать» является регулярным «d». Учитывая, что все параметры оцениваются до фактического вызова, значение «d» полностью предсказуемо/определено, не так ли? – Gaminic

2

Хорошо, первая вещь, которую вы должны знать, есть, символ хранится в памяти как Ascii Table. Поэтому в памяти char c будет иметь целое значение «8». Из таблицы мы знаем, что целое значение '8' является 56. В соответствии с таблицей, мы получим:

'8': 56

'0': 48

'9' : 57

Итак, давайте начнем.

c++: Это инструкция, которая добавляет c на единицу и возвращает значение текущего c.

Пример:

int a,c; 
c=1; 
a=c++; 
printf("a=%d,c=%d",a,c); 

Результатом этого кода является "= 1, с = 2"

так %d С ++ по-прежнему 56.

d+=c>'0'&&c<='9': В соответствии с приоритетом языка C это заявление будет выглядеть так:

d+=(c>'0'&&c<='9')

Итак, давайте начнем с c>'0'&&c<='9'. Это условие. Значение cc Ascii отличное или равное значению Ascii от 0 и меньше или равно 9 Ascii-значению (уведомление c's Ascii теперь составляет 56 или 57, потому что порядок оценки printf не определен. Таким образом, это будет 56, если этот оператор оценивается до c++ или 57, если после c++. Но в обоих направлениях, c<='9' верно) ДА. Таким образом, утверждение верно. В C ИСТИНА составляет 1.

Таким образом, d+=c>'0'&&c<='9' будет d+=1, что означает d = d + 1. Так %d дублетов равно 9.

Таким образом, результат «9-56»

+1

«printf будет оцениваться справа налево»: порядок, в котором оцениваемые параметры не определены http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function-calling-in -c – Deepthought

+0

@ Deepthought этого не заметил. Я изменю свой ответ. Благодарю. – zyc

+0

Просьба пояснить это: «C++: это означает, что c и 1 будут содержать результат в переменной temp. После этого оператора скопировать форму результата в значение temp на c. Поэтому внутри текущего оператора значение c останется неизменным, поэтому% d из C++ все еще 56. " –

Смежные вопросы