在C语言中,定义int a = 0, b = a++, c = a++;
是否具有定义行为?
或者几乎等效地说,在对象定义中的逗号是否引入了一个序列点,就像表达式中的逗号运算符一样?
类似的问题也被提出过关于C++:
C++的广泛接受的答案是根据C++11标准第8/3段的规定:是的,它是完全定义的:
在声明中,每个init-declarator都被单独分析,就好像它是一个独立的声明一样
虽然这段话只涉及到语法分析阶段,并且对于运行时操作的顺序并不十分精确。
C语言的情况如何?C标准是否定义了行为?
类似的问题以前也有人问过:
在声明多个对象的声明中,逗号是否引入类似逗号运算符的序列点?
然而,答案似乎特指C11草案,可能不适用于更近期的C标准版本,因为信息性附录C的措辞自C11草案以来已经发生变化,并且与标准文本似乎不完全一致。
编辑:当然,这样的初始化器似乎没什么意义。我绝对不赞成这种编程风格和结构。这个问题起源于关于一个微不足道的定义的讨论:int res = 0, a = res;
,其行为似乎没有完全定义!带有副作用的初始化器并不那么常见,例如考虑这个例子:int arg1 = pop(), arg2 = pop();