C布尔逻辑

3

我一直在尝试使用C语言编写一些程序,最近遇到了这个问题...

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

有人能否找出问题所在,如果我编译程序,结果会是0。

当我在C#中尝试相同的代码时

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

这将会生成错误。

(错误1:运算符 '!' 不能应用于类型为 'int' 的操作数 C:\Documents and Settings\SANDEEP\My Documents\Visual Studio 2005\Projects\ConsoleApplication18\ConsoleApplication18\Program.cs 21 17 ConsoleApplication18)

我想知道我的C代码的输出为什么无法工作,以及如何在C#中使用 ! 运算符。请帮忙。


7
C程序输出0,表明其行为是正确的。你期望它做什么? - Paul R
1
回答你的第二个问题,似乎 c#(与 c 不同)不允许将整数视为布尔值。 - Evan Teran
3
编辑此内容以删除大写字母中的喊叫... 唉... 你听说过网络礼仪吗?请不要使用文本语言 - 我们说和读英语... - t0mm13b
1
@Martin:与普遍的观念相反,一般情况下C++编译器不能编译C代码;然而,这两种语言有一个共同的子集,使得我们可以编写能够在两种语言的编译器上都能编译的代码。 - Christoph
4
当您询问有关某个事物“不起作用”的问题时,您需要解释是什么让您相信它不起作用以及您期望它如何运作。您的C程序运行良好,正如应该的那样。因此,当您描述程序的正确行为并断言它“不起作用”时...嗯,这听起来像无意义的话。 - AnT stands with Russia
显示剩余2条评论
8个回答

9

5被解释为布尔值时是true,所以!5得到的布尔结果是false,这导致&&也是false。将false解释为int0


9
在C语言中,任何非零值,如5被视为“真”,因此!5的结果为0或“假”。因此,0 && 3也是假的。请参见C语言中的逻辑运算符
在C#中,类型系统在这方面要强一些。 操作符仅适用于bool类型的值,该类型与整数类型完全独立。请参见C#中的!运算符

1
+1;准确地说:任何非零标量值都被视为“真”。 - Christoph

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;
}

在C#中,你不能像这样将 "!" 应用于整数。我相信你可以通过对整数使用 "~" 来实现这一点。你可以将 "!" 应用于布尔值(我不知道在C#中它被称为什么)。


2

这段C代码的等效代码为:

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

在C#中将会是:

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

请注意,C#不允许在int类型上使用布尔逻辑运算符。如果您想将int类型转换为bool类型,您需要编写代码来完成这个过程,就像我在这里所做的一样。
两个程序都正确输出了零,因为5不等于0,因此!5(C)或!(5!=0)(C#)是false。在C中,false转换为零。在C#中,条件运算符的另一种选择会给出零。
这回答了你的问题吗?

1
“如何在C#中使用!运算符?”
这是逻辑非运算符。您可以将其放置在布尔值的右侧,它会产生相反的结果。在C#中,没有从整数到布尔值的隐式转换。
顺便说一下,在C#中,您的“相同代码”中有不同的数字值!

如果你想在C#中实现与C语言中逻辑非相同的效果,只需使用number==0即可。 - Matteo Italia

0
在C#(和Java)中,你可以这样做:
k = (4 == 0) && (j != 0);

为了获得与您的C程序相同的行为。将整数与0进行比较可以得到与C相同的“逻辑”。


0

-1

如果你想进行位运算而不是简单的布尔运算,那么你的C代码使用了错误的运算符。这里有一个示例链接,其中包含正确的运算符。

在你当前的C代码中,k=!5&&j,5被认为是true,所以!5是0(false)。然后你将它与j进行AND运算,但任何false与任何布尔值进行AND运算都是false,所以你得到了0。

你可能想要类似于(tilda5)&j的东西


标题是C布尔逻辑,而不是C位运算。 - Bertrand Marron
@fusbar 我编辑了标题。原来的标题只指“逻辑”。 - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接