C -带逗号操作符的意外输出



我写了一个程序

#include<stdio.h>
int main()
{
      int x=3;
       if((x)==1,2,4,5,6)
               printf("number found in the listn");
       else
               printf("Number not found n");
      return 0;
}

我期望输出是"未找到的数字",但它是"在列表中找到的数字"为什么它是这样

==运算符的优先级高于,,因此if-子句的计算结果为

if (((x) == 1),2,4,5,6)

始终为真,因为逗号操作符的最后一个"元素"计数(6)。

来自C11标准:

逗号操作符的左操作数计算为void表达式[…]。然后对右操作数求值;结果的类型和值

您期望(x) == 1,2,4,5,6被评估为" x相当于 1, 2, 4, 56中的之一",但这不是逗号操作符的工作方式。这实际上是计算为(x)==1,然后是2,然后是4,然后是5,最后是6。由于6不是0,因此条件的计算结果为true,并执行第一个分支。

你需要写

if ( x == 1 || x == 2 || x == 4 || x == 5 || x == 6 )

或者,你需要使用一个循环:

int list[] = {1,2,4,5,6};
size_t listSize = sizeof list / sizeof *list;
int found = 0;
for ( size_t i = 0; !found && i < listSize; i++ )
  found = (x == list[i]);
if ( found )
{
  printf( "Number found in listn" );
}
...

最新更新