【问题标题】:what is the meaning of == sign?== 符号是什么意思?
【发布时间】:2011-04-07 03:29:16
【问题描述】:

我想弄清楚这个程序中 == 符号的含义是什么?

int main()
{
    int x = 2, y = 6, z = 6;        
    x = y == z;
    printf("%d", x);
}

【问题讨论】:

  • 嗯,它打印什么?对于yz(和x,为了完整性)的其他值,它会打印什么?
  • 这样写更容易理解:x=(y==z);
  • 在您的示例中,由于y 等于z,它将打印1。如果y 不等于z,它将打印0
  • 猜这是作业,因为我们几天前已经看到完全相同的错误示例代码,不是吗?

标签: c syntax operators


【解决方案1】:

== 运算符测试相等性。例如:

if ( a == b )
    dosomething();

而且,在你的例子中:

x = y == z;

如果 y 等于 z,则 x 为真 (1)。如果 y 等于 z,则 x 为假 (0)。

新手 C 程序员常犯的一个错误(以及一些非常有经验的程序员也会犯的错字)是:

if ( a = b )
    dosomething();

在这种情况下,将 b 分配给 a 然后作为布尔表达式求值。有时程序员会故意这样做,但这是不好的形式。另一个阅读代码的程序员将不知道它是有意(很少)还是无意(更有可能)完成的。更好的结构是:

if ( (a = b) == 0 )   // or !=
    dosomething();

这里将b赋值给a,然后将结果与0进行比较,意图很明确。 (有趣的是,我曾与 C# 程序员一起工作过,他们从未编写过纯 C 并且无法告诉你这是做什么的。)

【讨论】:

  • 为了完整起见,y == z 的值为 1 或 0。因此“x 为真(非零)...”最好替换为“x 为 1 ... "。
  • 确实如此,但并非总是如此。在 ANSI 标准存在之前,我从 C 开始。 K&R 没有具体说明关系运算符的结果,只是说它们确定“结果的真假”(第 38 页)。他们确实继续说“一元否定运算符!将非零或真操作数转换为 0,并将 0 或假操作数转换为 1。”由于 K&R 是当时唯一的标准,我学会了不要对布尔表达式的结果做出假设。 ANSI C (X3.159.198x) 草案在“3.3.8 关系运算符”和“3.3.9 相等运算符”中修复了这个问题。
  • int war = 0; if (war = 1) { launchnuke(); } 不可原谅的错字。
【解决方案2】:
int main() 
{ 
    int x = 2, y = 6, z = 6;         
    x = y == z; 
    printf("%d", x); 
} 

让我们这样开始:

 x = (6==6)

它问6等于6吗?:是的

x = true,但由于 x 是 int,x= 1 x 的新值为 1。

打印如下:

1

【讨论】:

    【解决方案3】:

    这样想:

    = 表示给某物一个值。

    == 表示检查它是否等于一个值。

    例如

    int val = 5; //val is 5
    //= actually changes val to 3
    val = 3; 
    
    //== Tests if val is 3 or not. 
    //note: it DOES NOT CHANGE the value of val.
    val == 3; 
    
    int new_val = val == 3; //new_val will be 1, because the test is true
    
    //the above statement is the same as
    bool is_val_3 = false;
    if( val == 3 )
       is_val_3 = true;
    int new_val;
    new_val = is_val_3;
    
    //putting it together, 
    val = new_val == 2; //sets val to 0. do you understand why now?
    

    【讨论】:

      【解决方案4】:

      它是“等于”运算符。

      在上面的例子中,x 被赋值为相等测试 (y == z) 表达式的结果。因此,如果y 等于z,则x 将设置为1 (true),否则0 (false)。由于 C(C99 之前)没有布尔类型,因此表达式的计算结果为整数。

      【讨论】:

      • 我没有投反对票,但是 C99 确实 有一个布尔类型 via。 stdbool.h - 它是一个实际的编译器支持的类型,而不仅仅是 intenum(尽管(int) true == 1 仍然存在)。开发者不必使用它。
      • @delty,可能应该澄清一下我的意思是 C89。
      • @detly:它被命名为_Bool。光是名字就足以减少过度使用……
      • @detly:不,标准定义了类型_Bool作为用户使用的类型(6.2.5.2)。它还定义了 <stdbool.h> 定义了 macro bool 以扩展为 _Bool(它仍然是出现在错误消息和警告中的名称。条款 7.1.3.1 使 _Bool 保留标识符,但这并不意味着程序不应该使用它——这意味着程序不允许为这个名称本身引入定义。目标是为编译器编写者未来提供一个命名空间标准扩展名。(名称_Complex_Imaginary 也适用于用户。)
      • 哦,标准明确规定未定义 booltruefalse 很好,而更改 _Bool 会导致未定义的行为。
      【解决方案5】:

      == 运算符用于相等.. 在你的例子中 如果 y 等于 z 那么 x 将具有真值,否则 x 将具有假值

      【讨论】:

        【解决方案6】:

        == 的意思是“对”。此运算符的优先级高于 =(等于)运算符。所以方程 x = y == z;将尝试将 y==z 的结果分配给变量 x。在这种情况下为 1。

        【讨论】:

        • 感谢您提及优先级。新手 C 程序员的另一个潜在雷区。 +1
        【解决方案7】:

        这是说

        X 将等于 true/1 或 false/0。

        查看该行的另一种方式是:

        x =  ( is y equal to true? then true/1 or false/0 )
        

        【讨论】:

          【解决方案8】:

          平等。如果操作数相等则返回 1,否则返回 0。

          【讨论】:

            猜你喜欢
            • 2014-05-11
            • 1970-01-01
            • 1970-01-01
            • 2022-12-22
            • 2010-09-29
            • 2011-04-18
            • 1970-01-01
            • 2020-04-02
            • 2019-11-17
            相关资源
            最近更新 更多