Я получаю странный вывод в C? - PullRequest
3 голосов
/ 13 февраля 2011

Вот программа на c. Я получаю странный вывод.

Когда num1 = 10 и num2 = 20 ->

#include<stdio.h>
void main()
{
int num1=10,num2=20;
clrscr();
if(num1,num2)
{
    printf("TRUE");
}
else
{
    printf("FALSE");
}
getch();
}

Выход: ИСТИНА

когда num1 = 0 и num2 = 220 Выход: ИСТИНА

Но когда num1 = 0 и num2 = 0: Выход: ЛОЖНЫЙ Почему это происходит? также, что означает приведенный ниже код:

if(num1,num2)

Заранее спасибо!

Ответы [ 6 ]

3 голосов
/ 13 февраля 2011

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

Именно поэтому ваша программа печатает FALSE, только если num2 оценивается в false влогический контекст (например, 0, 0.0 или NULL).

2 голосов
/ 13 февраля 2011
  1. Узнайте об операторе запятой в c http://en.wikipedia.org/wiki/Comma_operator. i = (a, b) означает хранилище b в i.
  2. Все, кроме 0 в c, верно. так что если (3) если (-3) все верно только если (0) ложно
2 голосов
/ 13 февраля 2011

In:

if(num1,num2)

последнее выражение переопределяет все предыдущие, поэтому оно совпадает с:

if(num2)

, поскольку num2 равно 0, вы получаете FALSE.

Если вы проверите это, http://msdn.microsoft.com/en-us/library/2bxt6kc4(v=vs.71).aspx, означает последовательную оценку, то есть выражения вычисляются один за другим, последним является ваш номер2.

1 голос
/ 13 февраля 2011
if(num1,num2)

Используется оператор запятой.Оператор запятой вычисляет первый операнд, отбрасывает результат, затем второй операнд и возвращает результат.Таким образом, (a, b) вычисляет a, вычисляет b, а затем возвращает b.

Это должно прояснить вашу путаницу для логических случаев, в каждом из которых утверждение имеет эффект просмотра значения b.

0 голосов
/ 13 февраля 2011

Я предполагаю, что вы хотите, чтобы «если a и b верны».Запятая, которую вы используете, означает, что вы оцениваете только последнюю переменную.

Я думаю, что вам нужно:

if(num1 && num2) /* num1 AND num2 */

Вам нужно использовать && (логическое И), а не &Который побитовый И)

0 голосов
/ 13 февраля 2011
if(num1,num2)

не является синтаксической ошибкой, но является логической ошибкой.По сути, это разрешится только на

if(num2)

Только последняя переменная оценивается

...