You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 18:52:26