yyyyye #include <stdio.h> typedef struct { int b, c, d; double a; } A; int main() { A a{3.1, 2, 3, 4}; printf("%.0lf %d %d %d", a.a, a.b, a.c, a.d); return 0; } 在c++环境下编译上述代码,其运行结果是什么?为什么? 希望大家交流的时候不要只发答案,能够简要说明一下原因。
yyyyye 正确答案: 在c++11及以上的标准编译环境中,该代码都将编译错误:error: type 'double' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing] (1)在初始化列表进行初始化时,会按照变量在结构体中定义的顺序来初始化,因此该题目中初始化顺序依次为b->c->d->a。 (2)在初始化列表中,若有数据范围较大的变量尝试隐式转换为数据范围较小的变量,都将认为是“窄化转换”。 eg. $double\ to\ int$ $double\ to\ float$ $long\ long\ to\ int$ $int\ to\ char$ ...... 这种行为下,数据精度可能会出现丢失,因此为了避免这种情况的发生,c++会对此进行报错。因此,将变量b初始化为3.14属于“窄化转换”行为,应对该错误进行显示转化。