代码:
int main(void)
{
auto a=1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当文件具有.c扩展名时,MS Visual Studio 2012编译器会编译无错误.我一直认为,当你使用.c扩展名时,编译应该是根据C语法,而不是C++.而且,据我所知,自C++ 11以来只允许在C++中使用auto类型,这意味着该类型是从初始化程序推导出来的.
这是否意味着我的编译器不坚持C,或者C语言中的代码实际上是否正确?
在C中,当用于使用scanf读入浮点变量时,格式说明符%f,%e,%g,%E和%G是否有任何差异?也就是说,代码片段的行为是否会发生
float x;
scanf("%<one of f, e, g, E, G>", &x);
Run Code Online (Sandbox Code Playgroud)
是否依赖于说明者的选择?
我首先假设%f只能正确解释十进制表示法,而%e只能正确解释科学记数法,但在我的系统中,每种情况下都可以正常工作.但也许我的系统只是自由主义......
我在书本或网上找不到任何明确的陈述......
我最近读过这篇文章
unsigned char x=1;
printf("%u",x);
Run Code Online (Sandbox Code Playgroud)
由于格式说明符%u,因此调用未定义的行为,printf需要unsigned int.但我还是想了解这个例子中发生了什么.
我认为整数推广规则适用于表达式printf("%u",x)
和由...表示的值x
.
A.6.1整体推广
无论是否有符号,都可以使用字符,短整数或整数位字段,或者枚举类型的对象,可以在任何可以使用整数的表达式中使用.如果int可以表示原始类型的所有值,则该值将转换为int; 否则该值将转换为unsigned int.这个过程称为整体推广.
"可以使用"是什么意思?这是否意味着"在句法上是正确的"还是"定义的行为"?
在这个例子中如何推广x?我已经读过它被提升为一个int,但是如果printf("%u", (int x))
仍然是未定义的行为那么我真的不明白为什么......
c printf variadic-functions undefined-behavior integer-promotion
我使用的学习C书中说,如果二元运算符(除=
,&&
和||
)与浮点类型的一个操作数(比如说,使用float
)和整数类型(比如,一个操作数int
),那么整数值转换为浮点值,并且该浮点类型也将是运算结果的类型。
我不理解大胆的部分。例如,比较运算符为什么要<
返回浮点数?
我试过了
float a=2.0;
int b=1;
printf("%d\n",(b<a)*16777217);
Run Code Online (Sandbox Code Playgroud)
并按我的预期打印16777217。数字16777217在我的系统上不能表示为浮点数。
因此,我认为这表明(b<a)
int 的类型是int,而不是(b<a)*16777217
float- 如果它是float,则其类型也将是float,其值将在值16777217附近,并且此附近的值将被打印。
更多,如果我尝试
float a=2.0;
int b=1;
printf("%f\n",(b<a)*16777217);
Run Code Online (Sandbox Code Playgroud)
它打印0.000000。
我弄错了吗,还是书中的主张错了?