我写了一个程序
#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
, 5
或6
中的之一",但这不是逗号操作符的工作方式。这实际上是计算为(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" );
}
...