【问题标题】:why using the assignment operator instead of equal to operator works in the following situation?为什么在以下情况下使用赋值运算符而不是等于运算符?
【发布时间】:2020-11-24 23:39:21
【问题描述】:

为了使if 语句起作用,您应该有一个判断为真或假的条件。我不明白以下代码的 p=fopen("test.txt", "r") 部分如何评估为真或假,因为它只包含赋值运算符 = 而不是 == 运算符。

#include <stdio.h>
int main()
{
  FILE *p;
  if(p=fopen("test.txt","r"))
  {
      printf("yes\n");
  }
  else
    printf("no\n");
  return 0;

【问题讨论】:

  • 你需要检查p是否为null,所以fopen()是否成功!
  • @Gonçalo 但这里隐含着这种情况,问题是为什么。
  • @Rup 是的,这是真的
  • @Rup 所以假设你有一个代码依赖于你的文件在这种情况下p 并且你正在使用选项r 来读取它,但是假设你的文件不存在,你你的程序会有很大的问题,所以你需要检查fopen() 是否顺利。在另一种情况下,您使用某些东西来创建文件并阅读它!它不会有问题,因为你会创造它!但是在这种情况下,如果文件不存在,您就会遇到问题
  • @Gonçalo 是的,OP 的代码已经在这样做了:如果p 不为空,它将为printf("yes\n");,如果为空,则为printf("no\n");。问题是为什么if(p=fopen("test.txt","r")) 隐式测试p 是否为空。

标签: c if-statement conditional-statements selection


【解决方案1】:

来自C11 规范,第 6.5.16 章,

" 赋值表达式在赋值后具有左操作数的值 [....]"

所以基本上,你的代码是一样的

p=fopen("test.txt","r");
if(p) {  // or, if (p != NULL) for ease of understanding
 // do something

 }

【讨论】:

    【解决方案2】:

    来自 C 标准)6.8.4.1 if 语句)

    2 在这两种形式中,如果表达式 比较不等于 0。 在 else 形式中,第二个子语句是 如果表达式比较等于 0,则执行。如果第一个 子语句通过标签到达,第二个子语句不是 执行。

    和(6.5.16 赋值运算符)

    3 赋值运算符将值存储在由指定的对象中 左操作数。 赋值表达式具有左边的值 赋值后的操作数,111) 但不是左值

    所以表达式的值

    p=fopen("test.txt","r")
    

    是一个指针,在函数fopen成功调用的情况下不等于0。

    【讨论】:

      【解决方案3】:

      如果你不使用赋值,那么p 将包含未初始化的垃圾。一般来说,在条件中使用赋值运算符被认为是不好的做法(大多数编译器会警告它),因为它很危险且难以阅读。但它是完全有效的,因为= 运算符与大多数运算符一样具有结果,在本例中为p 的值。

      因此,您示例中的代码是一种更草率、更糟糕的编写方式

      p=fopen("test.txt","r")
      if(p)
      

      这又是一个草率的版本

      if(p != NULL)
      

      【讨论】:

      • 是的,这就是我要找的东西
      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2013-08-04
      相关资源
      最近更新 更多