2017-01-17 3 views
-5

Рассмотрим этот код, который я написал, который использует и ifelse заявлениеBasic, если другого заявления

#include <iostream> 
#include <stdio.h> 
using namespace std; 

int main() { 
    int a = 5; 
    if(a) 
    { 
     printf("if %d\n" , ++a); 
    } 
    else 
     printf("else %d\n" , a); 
} 

Если я установить int a = 5 печатает выходы «если 6»

Но если я устанавливаю int a = 0 он печатает значение «else 0»

Почему это происходит в чем причина?

+3

Можете ли вы уточнить, какая часть вас путает? –

+0

Как вы думаете, 'if (a)' должен делать? – AndyG

+0

@ FrançoisAndrieux Часть Я запутался в том, почему она увеличивает значение до 6 в выражении if, когда int a = 5.и когда я заменяю тот же int a = 0, он печатает else 0 –

ответ

5

++a увеличивает значение a на единицу и является выражением, которое равно этому приращенному значению.

  1. Когда a 5, if (a) является if (true), как a отлична от нуля. Так printf("if %d\n" , ++a); прогонов ++a в том, что приращений заявление a и вычисляет, что измененное значение, 6.

  2. Когда a является 0, if (a) является if (false). Итак, printf("else %d\n" , a); работает. a не изменяется в этом случае.

+1

Отличное объяснение, спасибо за помощь новичкам. – Ceros

+0

Я узнал о значении приращения, но то, что я не понимаю, является причиной того, почему он печатает 0, а мой int a = 0, почему бы не увеличить его на 1? –

+0

, например, int a = 5, если он увеличивает значение ++ a, он будет работать таким образом a + 1 = 5 + 1 = 6, почему can not то же самое применяется к int a = 0, как в a + 1 = 0 + 1 = 1? так почему в этом случае он не увеличивается до 1 –

1

Я считаю, что происходит, это путаница, понимающая, что происходит с утверждением if.

int main() { 
    int a =5; 
    if(a) 
    { 
     printf("if %d\n" , ++a); 
    } 
    else 
     printf("else %d\n" , a); 
    return 0; 
} 

Этот код, по существу, эквивалентен:

int main() { 
    int a =5; 
    printf("if %d\n" , ++a); 
    return 0; 
} 

выхода: 6

Если 0 код будет эквивалентен:

int main() { 
    int a =0; 
    printf("else %d\n" , a); // Notice no ++ 
    return 0; 
} 

выход: 0

Если вы напишете код, как:

int main() { 
    int a =5; 
    printf("if %d\n" , a); // Notice no ++ 
    return 0; 
} 

выход: 5

if будет вычисляться значение, хранящееся в скобках так, например, :

int a = 0; 
if(a) // since a is 0, the value equates to false and the if is ignored 
{ 

} 
else // since the if evaluated to false it will do the else. 
{ 

} 

В экземпляре:

int a = 5; 
if(a) // a is non-zero therefore it equates to true, and the if body is ran 
{ 

} 
else // since the if was true the else is ignored, and its body wont be run. 
{ 

} 

Теперь давайте разбивку, почему в вашем случае = 5 печатали из 6.

В C++, есть операторы называют postfix и prefix операторов, Postfix операторы будут работать после того, как в то время как операторы префикса будут выполняться перед оператором.

Эти операторы будут непосредственно влиять на значение.

++ a - оператор префикса, который разрешается перед вашим printf и извлекает значение.

A ++ - постфикс оператор возвращает значение, а затем получает решен после Printf

а - ни один оператор просто не возвращает значение.

Вы можете узнать больше об этих операторов здесь: http://en.cppreference.com/w/cpp/language/operator_incdec

Вирсавии, ответ 100% правильно. Написал этот ответ, чтобы попытаться улучшить ваше понимание и всех, кто приходит сюда с теми же проблемами.

+0

Благодарим вас за очищение истинной ложной концепции здесь, в If -Else, теперь я четко понял, как и почему он работает и печатает 0 Принимая int a = 0 –

0

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

#include <iostream> 
#include <stdio.h> 
using namespace std; 

int main() { 
    int a; 

    a = 5; 
    if(a) // check whether a is zero (false) or non-zero (true) 
    { 
     // variable a has a non-zero value (true) 
     printf("if %d\n" , ++a); // preincrement variable a then print value 
    } 
    else { 
     // variable a has a value of zero (false) 
     printf("else %d\n" , a); // print value as it is 
    } 

    a = 0; 
    if(a) // check whether a is zero (false) or non-zero (true) 
    { 
     // variable a has a non-zero value (true) 
     printf("if %d\n" , ++a); // preincrement variable a then print value 
    } 
    else { 
     // variable a has a value of zero (false) 
     printf("else %d\n" , a); // print value as it is 
    } 

    return 0; 
} 

Существует разница между прединкрементом переменным, используя ++ а, и postincrement переменного, используя ++.

Preincrement, ++ a, увеличивает значение переменной и делает новое значение доступным для следующего оператора или действия.

Postincrement, a ++, делает текущее значение переменной доступным для следующего оператора или действия, а затем увеличивает эту переменную.

Посмотрите на следующий код.

int a; 
int b; 

a = 5; 
b = a; // straight assignment, no increment, b now contains 5. 
b = a++; // postincrement a, do assignment, b now contains 5, a contains 6 
b = ++a; // preincrement a, do assignment, b now contains 7, a contains 7 

Теперь в вашем коде вы сначала присвоить значение 5 переменной a. Когда вы делаете if, вы проверяете, соответствует ли значение a (значение отличное от нуля) или false (значение равно нулю). Так как a равно 5, значение отличное от нуля, то оно принимает путь then.

При использовании printf() значение a модифицировано с использованием преэнкремента. Это означает, что значение a сначала увеличивается, а затем новое значение a используется в printf(). Таким образом, вы печатаете значение преинкрементной переменной a, которая составляет 6 печатать «если 6».

Если вы использовали постинкрест, тогда старое значение a было бы использовано в printf() `printing", если 5 ".

Затем вы устанавливаете значение переменной a в ноль. Если проверяется, является ли a истинным, отличным от нуля или ложным, нолем, а так как a теперь равен нулю или false, то путь будет else. В этом printf() вы просто печатаете значение переменной a, так что вы видите «else 0».

+0

Спасибо. За пояснение концепции приращения post и pre increment. также ненулевое значение теперь я полностью понял это –

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