如果逗号运算符的关联性是从左到右,那么为什么第一个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
答案 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个参数,你也会在那里调用一种不同的未定义行为,可能会导致崩溃,或者如果幸运的话,还有编译器消息。