«C - C ++» шутка о порядке постфиксных / префиксных операций - PullRequest
0 голосов
/ 19 ноября 2010

Мой друг прислал мне шутку:

Q. В чем разница между C и C ++?

A. Ничего, потому что: (C - C ++ == 0)

Я пытался изменить порядок и застрял.

Посмотрите на этот код:

public class Test {
    public static void main(String args[]) {
        int c = 10;         
        System.out.println(c++ - c);
        System.out.println(++c - c);        
    }
}

Почему он возвращает:

-1
0

Я понимаю постфиксный и префиксный приращение. Почему это не результат?

0
1

Ответы [ 7 ]

11 голосов
/ 19 ноября 2010

Поскольку в первом примере c начинается с 10. c++ увеличивает c и возвращает 10, поэтому второй c теперь оценивается как 11, поскольку он был увеличен.Таким образом, окончательное вычисленное выражение равно 10 - 11, что равно -1.

Во втором примере ++c снова увеличивает c, но возвращает 12, поскольку это предварительное приращение.Второе значение c также оценивается как 12, поскольку это новое значение сохраняется в c.Таким образом, это выражение в конечном итоге оценивается как 12 - 12, что равно 0.

2 голосов
/ 19 ноября 2010

Поскольку c++ - c становится (c - c-incremented-by-one), что равно -1, а ++c - c становится (c-incremented-by-one - c-incremented-by-one), что равно 0.

1 голос
/ 19 ноября 2010

Выводит ли он 0 или -1 для первого println и 0 или 1 для второго, не определено.Компилятор может сначала оценить левую или правую часть, и, таким образом, вступили ли в силу приращения к моменту оценки правой части, будет зависеть от компилятора (и действительно, компилятор мог делать одно и то и другое одновременноnext)

Приращения гарантированно будут выполняться только в следующей точке последовательности .Вычитание не является точкой последовательности.

РЕДАКТИРОВАТЬ: Бах, написал этот ответ, когда вопрос был помечен C / C ++. Точки последовательности не относятся к Java .Я оставил ответ на тот случай, если другие посчитают его полезным при рассмотрении выражений C / C ++

1 голос
/ 19 ноября 2010

Разница в используемых вами операторах ++ c и c ++

c ++ будет увеличивать значение ДО ТОГО, как оно используется в вычислениях ++ c будет увеличивать значение ПОСЛЕ того, как оно используется в вычислениях

также ответ cdhowie объясняет это лучше

0 голосов
/ 19 ноября 2010

Я использовал этот код C ++

Причина проста. Оператор ++ создает копию переменной var, увеличивает значение, а затем возвращает скопированное значение val. Если предположить, что операторы вычисляются слева направо, они пройдут 10-10 (затем inc C), то есть всегда их 0. Однако в большинстве случаев в зависимости от порядка «неопределенное поведение», и некоторые компиляторы, такие как gcc, выдают предупреждение (пример http://codepad.org/UPBqO38B)

int main()
{
int c=10;
printf("%d", c-c++);
}
0 голосов
/ 19 ноября 2010

В этом разница между постфиксом и приращением префикса.

Вот хороший текст:

http://www.java -samples.com / showtutorial.php? Tutorialid = 249

"Оператор инкремента (++) и оператор декремента (-) имеют две разновидности: префикс и постфикс. Разновидность префикса записывается перед именем переменной (++ myAge);Разновидность postfix пишется после (myAge ++).

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

Семантика префикса такова: Увеличивайте значение и затем извлекайте его. Семантика постфиксаотличается: извлеките значение и затем увеличьте оригинал.

Сначала это может сбить с толку, но если x является целым числом со значением 5, и вы пишетеe

int a = ++ x;Вы сказали компилятору увеличить x (сделать его равным 6), а затем извлечь это значение и присвоить его.Таким образом, a теперь равно 6, а x теперь равно 6.

Если после этого вы напишите

int b = x ++;Теперь вы сказали компилятору извлечь значение в x (6) и присвоить его b, а затем вернуться назад и увеличить x.Таким образом, b теперь равно 6, но x теперь равно 7. В приведенном ниже листинге показано использование и последствия обоих типов. "

0 голосов
/ 19 ноября 2010

Поскольку приращение выполняется перед операцией в одном случае, тогда как приращение выполняется после операции в другом случае.

int c = 10;
System.out.println(c); // output 10
System.out.println(c++); // outputs 10
System.out.println(c); // output 11
System.out.println(++c); // output 12
System.out.println(c); // output 12
...