С булевой логикой

2

Я пробовал некоторые программы на языке C и сталкивался с этим...

#include<stdio.h>
int main()
{
    int j=3,k;
    k=!5&&j;
    printf("%d",k);
    return 0;
}

может кто-нибудь выяснить, в чем проблема в этом случае, если я скомпилирую программу, я приведу к 0

и когда я попробовал тот же код в С#

 public void logic()
    {
        j = 5;
        k = !4 && j;
        Console.WriteLine("hence the value would be " + k);

    }

это сгенерирует ошибку * (Ошибка 1 Оператор '!' не может применяться к операнду типа 'int' C:\Documents and Settings\SANDEEP\Мои документы \Visual Studio 2005\Projects\ConsoleApplication18\ConsoleApplication18\Program. cs 21 17 ConsoleApplication18)

Я хочу знать, почему вывод моего кода c не работает и как я могу использовать! оператор в С#..... plz help....

  • 7
    Программа на C работает правильно, выводя 0. Что вы ожидаете от нее?
  • 0
    Они в одной программе?
Показать ещё 5 комментариев
Теги:
boolean-logic

8 ответов

8
Лучший ответ

В C любое ненулевое значение, такое как 5, считается "истинным", поэтому !5 оценивается как 0 или "false". Таким образом, 0 && 3 также является ложным. Логические операторы в C.

В С# система типов немного сильнее в этом отношении. Оператор ! работает только с значениями типа bool, который полностью не зависит от целых типов. См. ! Оператор в С#.

  • 1
    +1; если быть точным: любое ненулевое скалярное значение считается истинным
9

5, когда интерпретируется как логическое значение, истинно, поэтому !5 дает логический результат false, что приводит к тому, что && также дает false. False интерпретируется как int - 0.

2

Читаемый код C: Скомпилируйте его, запустите его и как оцениваются выражения.

#include <stdio.h>
int main() {
        int j = 3, k;
        k = !5 && j;

        printf("!5 = %d \n", !5);
        printf("j = %d \n", j);
        printf("!5 && j = %d \n", !5 && j);
        printf("k = %d \n",k);

        return 0;
}

Вероятно, вы не можете применить "!" к ints на С# таким образом. Я считаю, что вы можете достичь этого, используя "~" на int. Вы можете aply "!" к булевому (я не знаю, как он вызвал в С#).

2

Эквивалентный код этому коду C

#include<stdio.h> 
int main() 
{ 
    int j=3,k; 
    k=!5&&j; 
    printf("%d",k); 
    return 0; 
}

в С# будет

class Program {
static int Main() 
{ 
    int j=3, k; 
    k = !(5 != 0) && (j != 0) ? 1 : 0; 
    Console.WriteLine("{0}", k); 
    return 0; 
}
}

Обратите внимание, что С# не позволяет использовать логические операторы boolean для int. Если вы хотите преобразовать ints в bools, вам придется писать код, чтобы сделать это, как я здесь.

Обе программы корректно выводят ноль, потому что 5 не равно 0, поэтому! 5 (C) или! (5!= 0) (С#) ложно. В C ложное преобразование в ноль. В С# альтернатива условного оператора дает нуль.

Отвечает ли это на ваш вопрос?

1

и как я могу использовать! оператор в С#.

Это логический оператор. Вы помещаете его справа от bool, и это создает противоположное. В С# нет неявного преобразования из целого числа в bool.

Кстати, ваш "тот же код" в С# имеет в нем разные значения!

  • 0
    И, если вы действительно хотите добиться того же самого эффекта C-логики, а не чисел в C #, просто используйте число == 0.
0

В С# (и Java) вы можете сделать что-то вроде

k = (4 == 0) && (j != 0);

чтобы получить то же поведение, что и ваша программа на C. Сравнение целого числа с 0 дает те же "логики", что и C.

0

Если вы хотите выполнить битовую арифметику вместо простой логической арифметики, ваш код C использует неправильные операторы. Здесь образец ссылки с правильными операторами.

В вашем текущем C-коде, k =! 5 && j, 5 считается истинным, поэтому! 5 равно 0 (false). Затем вы AND AND с j, но любой false ANDed с любым логическим значением false, поэтому вы получаете 0.

Вероятно, вы хотите что-то вроде (tilda5) & j

  • 0
    В заголовке написано C логическая логика, а не битовые операции.
  • 0
    @fusbar Название было отредактировано мной. В оригинале указана только «логика».
0

Вы пытаетесь сделать логическое NOT. Вы должны сделать побитовое НЕ на int в С# (оператор ~, а не!). См. Здесь:

http://msdn.microsoft.com/en-us/library/d2bd4x66(VS.71).aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню