逗号运算符行为

时间:2017-04-20 14:04:46

标签: c printf comma operator-precedence

如果逗号运算符的关联性是从左到右,那么为什么第一个import serial ser = serial.Serial('/dev/ttyAMA0',9600, timeout=1) IDs = ["xxxxxxxxxx","xxxxxxxxxx"] while True: bool = False; string = ser.read(20) if len(string) == 0: print "Insert tag" continue else: for i in range(len(IDs)): for l in range(len(string)): if IDs[i] in string: print IDs[i] bool = True break else: string = string[1:]+string[0] if bool: break if not bool: print "Not found" 首先执行第二个参数表达式而不是第一个参数?

printf

2 个答案:

答案 0 :(得分:3)

在您的示例中,代码printf("=%d",a=a+1,b=a+2);使用逗号分隔函数参数,编译器可以自由选择,首先进行评估。

首先评估最后一个参数(在这种情况下)的原因是依赖于实现的,并且可能与这个参数放在堆栈第一个,然后是第二个参数的事实有关,然后是第一个(这是printf()可以有可变数量的参数的原因 - 那些被推入堆栈,从"尾部"开始。

如果你真的想要强制执行优先级 - 使用括号,就像这样:

 printf("=%d", (a=a+1,b=a+2) );

这将确保首先完成逗号运算符参数评估 >

答案 1 :(得分:3)

printf("=%d",a=a+1,b=a+2);

这里的逗号不是逗号运算符,而是参数列表,是函数调用语法的一部分。

函数参数的评估顺序是未指定的行为,这意味着编译器可能首先评估左侧或右侧参数,而您无法知道哪些参数。

此外,您的代码包含更新变量a=a+1的副作用。这与使用a用于其他目的的代码相同,而不是确定要存储在a中的值,即b=a+2。这两个子表达式之间没有相互排序,因此您的代码会调用未定义的行为。这意味着这是一个错误,任何事情都可能发生。

由于你在printf中只有一个格式说明符,但是传递了2个参数,你也会在那里调用一种不同的未定义行为,可能会导致崩溃,或者如果幸运的话,还有编译器消息。