C89标准下结构体初始化的求值顺序与输入字节存储问题咨询
C89中结构体初始化器的表达式求值顺序问题
针对你给出的代码:
#include <stdio.h> struct s { int b1, b2; }; int main (void) { struct s var = {getchar(), getchar()}; /* ... */ }
在C89标准中,这个行为属于未指定行为,标准完全不保证var.b1一定存储标准输入的第一个字节、var.b2存储第二个字节。
原因很明确:C89规定,结构体初始化列表中各个初始化器的求值顺序是未指定的。编译器可以自由选择先调用第一个getchar(),还是先调用第二个getchar()——两种执行顺序都符合标准要求。
这意味着:
- 如果编译器先执行第一个
getchar(),那么b1存第一个输入字节,b2存第二个; - 如果编译器先执行第二个
getchar(),那么b1会存第二个输入字节,b2存第一个。
这种规则和C89里函数参数的求值顺序逻辑一致——都是未指定,由编译器实现决定,没有统一的标准约束。
内容的提问来源于stack exchange,提问作者green red
相关产品推荐
相关产品推荐

