2016-06-29 3 views
-6
void main() 
{ 
    int num, a=15; 
    num = ----a--; 
    cout<<num; 
    cout<<a; 
} 

Я попробовал ... я должен получить На бумаге, сог 4 минус компенсируют друг друга, и то, что осталось a--Каков результат этого кода? Я что-то пропустил?

Но на ПК я получаю ошибку компиляции сог - - до того, как a-- заставляет компилятор думать, что в этом «----» есть операторы pre/post decment, и запрашивает операнд. Какое решение?

+4

Решение состоит в том, чтобы не использовать такой зафускированный фрагмент кода и четко выражать то, что вы хотите. Программирование достаточно сложно, поэтому сделать это сложнее, чем это должно быть? – NathanOliver

+0

@NathanOliver no no на самом деле это именно то, что было задано в вопросительной бумаге –

+2

Почему '----' отменяет друг друга? '--' уменьшается, поэтому я не понимаю, почему двое из них будут уменьшаться и увеличиваться. Кроме того, при получении ошибки компилятора вы должны полностью указать точную ошибку, а не пытаться ее описать. – chris

ответ

3

Правильная программа может выглядеть, например, следующим образом

#include <iostream> 

int main() 
{ 
    int num, a = 15; 
    num = (----a)--; 

    std::cout << num << std::endl; 
    std::cout << a << std::endl; 

    return 0; 
} 

Его выход

13 
12 

Оператор постдекремент имеет более высокий приоритет, чем оператор предекремент и его результат rvalue, которые не могут быть изменены.

Это выражение

----a-- 

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

----(a--) 

и не будет компилироваться.

Таким образом, для компиляции программы вам необходимо использовать круглые скобки.

Примите во внимание, что соответствующая программа написана на C, как, например

#include <stdio.h> 

int main(void) 
{ 
    int num, a = 15; 
    num = (----a)--; 

    printf("%d\n", num); 
    printf("%d\n", a); 

    return 0; 
} 

не будет компилироваться, так как оператор предекремент в C также возвращает RValue и вы не можете применить оператор к RValue.

Действует только программа на С ++.

+0

, но дело в немодифицированной версии (то, что было напечатано), было именно тем, что когда-то было задано на экзамене за предыдущий год. поэтому выход из программы должен быть записан как «он не произведет o/p из-за ошибки компиляции»? –

+0

, но вещь - это немодифицированная версия (то, что набрала ive), именно то, что когда-то было задано на экзамене предыдущего года. поэтому выход из программы должен быть записан как «он не произведет o/p из-за ошибки компиляции»? –

+1

@NiranjanDixit Да, исходный код не будет компилироваться. –

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