C语言中的表达式求值

C语言中的表达式求值,c,operator-keyword,getchar,C,Operator Keyword,Getchar,它一次读取一个字符,如果遇到空格则停止。 但是它如何用空格来计算括号呢?括号的结果是什么?那么基本上,为了将它与一个空格进行比较,这个(x[num++]=getchar())等于什么 我在我的一本课堂教材中发现了这个例子,它是不同的,我得到了一个警告,所以我想这不是一个好的做法,是吗?这里的评估结果如何?它是否首先将读取值分配给x[num],然后将其与空格进行比较 while ((x[num++] = getchar()) != ' '); 在C中,a=b是一个表达式。它将b赋值给a,然后返回

它一次读取一个字符,如果遇到空格则停止。 但是它如何用空格来计算括号呢?括号的结果是什么?那么基本上,为了将它与一个空格进行比较,这个(
x[num++]=getchar()
)等于什么

我在我的一本课堂教材中发现了这个例子,它是不同的,我得到了一个警告,所以我想这不是一个好的做法,是吗?这里的评估结果如何?它是否首先将读取值分配给
x[num]
,然后将其与空格进行比较

while ((x[num++] = getchar()) != ' ');

在C中,
a=b
是一个表达式。它将
b
赋值给
a
,然后返回
a
。因此,while循环中的条件意味着:

  • 调用
    getchar()
    获取用户的输入
  • getchar
    的结果分配给
    x[num]
  • num
    增加1
  • 检查
    x[num]
    是否不等于空格
    '
  • i、 e

    第二个示例具有完全不同的行为。这是因为
    =表达式将在赋值
    =
    之前求值,不带括号。因此,第二示例意味着

  • 调用
    getchar()
    获取用户的输入
  • 检查
    x[num]
    是否不等于空格
    '
  • 将步骤2中的结果(
    true
    false
    )分配给
    x[num]
  • num
    增加1

  • 警告是因为很容易错误地写
    而(a=b)
    意味着
    而(a==b)
    在C中,
    a=b
    是一个表达式。它将
    b
    赋值给
    a
    ,然后返回
    a
    。因此,while循环中的条件意味着:

  • 调用
    getchar()
    获取用户的输入
  • getchar
    的结果分配给
    x[num]
  • num
    增加1
  • 检查
    x[num]
    是否不等于空格
    '
  • i、 e

    第二个示例具有完全不同的行为。这是因为
    =表达式将在赋值
    =
    之前求值,不带括号。因此,第二示例意味着

  • 调用
    getchar()
    获取用户的输入
  • 检查
    x[num]
    是否不等于空格
    '
  • 将步骤2中的结果(
    true
    false
    )分配给
    x[num]
  • num
    增加1

  • 警告是因为很容易将
    while(a=b)
    误写为
    while(a==b)
    两个版本都不是好的编码;两者都忽略在读取空间之前达到EOF的可能性,并且都忽略在读取空间之前缓冲区溢出的可能性

    第一个在其他方面是正确的。它包含一项作业:

    while (true) {
      x[num] = getchar();
      num ++;
      if (!(x[num] != ' '))
        break;
    }
    
    赋值的结果就是赋值。因此,如果
    getchar()。然后将赋值结果与空白值进行比较;它们是不同的,循环会重复。如果
    getchar()
    返回一个空白,那么赋值的结果也是一个空白,空白等于空白,因此循环终止

    第二个明显有缺陷。因为赋值的优先级低于
    =,结果就像代码读取:

    x[num++] = getchar()
    
    也就是说,一个字符由
    getchar()
    读取并与空白进行比较,如果该字符不是空白,则生成值1;如果该字符是空白,则生成值0。此0或1被分配给
    x[num++]
    ,然后作为逻辑条件进行计算。如果结果为0,则循环终止;如果结果为1,则循环将继续。请注意,此版本中未记录读取的字符-这就是编译器发出警告的原因。这几乎总是一个错误;在那些不是错误的奇怪情况下,您可以告诉编译器,通过提供额外的括号,让编译器——以及您的人类观众——阅读您的代码的其他人——清楚地了解您的意图。(记住:如果你在6个月甚至6周后回来,你将是一个不同的人,很可能很难记住这些微妙之处。让每个人都明白。在括号内的代码和括号内的代码之间有一个很好的平衡。)

    代码可能应为:

    while (x[num++] = (getchar() != ' '))
        ;
    
    intc;
    int max=sizeof(x)-1;
    int num=0;
    while((c=getchar())!=EOF&&num

    特别要注意的是,
    c
    必须是
    int
    而不是
    char

    这两个版本都不是好的编码;两者都忽略在读取空间之前达到EOF的可能性,并且都忽略在读取空间之前缓冲区溢出的可能性

    第一个在其他方面是正确的。它包含一项作业:

    while (true) {
      x[num] = getchar();
      num ++;
      if (!(x[num] != ' '))
        break;
    }
    
    赋值的结果就是赋值。因此,如果
    getchar()。然后将赋值结果与空白值进行比较;它们是不同的,循环会重复。如果
    getchar()
    返回一个空白,那么赋值的结果也是一个空白,空白等于空白,因此循环终止

    第二个明显有缺陷。因为赋值的优先级低于
    =,结果就像代码读取:

    x[num++] = getchar()
    
    也就是说,一个字符由
    getchar()
    读取并与空白进行比较,如果该字符不是空白,则生成值1;如果该字符是空白,则生成值0。此0或1被分配给
    x[num++]
    ,然后作为逻辑条件进行计算。如果结果为0,则循环终止;如果结果为1,则循环将继续。请注意,此版本中未记录读取的字符-这就是编译器发出警告的原因。几乎是因瓦里