::(范围解析运算符)在此程序中执行什么操作? 我现在正在学习C++,在我读一本书的时候看到这个程序。 #include <stdio.h> double counter = 50; int main(){ for(int counter = 1; counter != 10; ++counter){ printf("%d\n",::counter/counter); } } #包括 双计数器=50; int main(){ 用于(整数计数器=1;计数器!=10;++计数器){ printf(“%d\n”,::计数器/计数器); } }
现在,我阅读了Scope Resolution操作符,我认为这将打印出全局变量计数器除以局部变量计数器。但是,程序会打印出以下内容: 2094374456 4195758 4195758 4195758 4195758 4195758 4195758 4195758 4195758 这些数字是什么?在这种情况下,范围解析操作符做什么::(范围解析运算符)在此程序中执行什么操作? 我现在正在学习C++,在我读一本书的时候看到这个程序。 #include <stdio.h> double counter = 50; int main(){ for(int counter = 1; counter != 10; ++counter){ printf("%d\n",::counter/counter); } } #包括 双计数器=50; int main(){ 用于(整数计数器=1;计数器!=10;++计数器){ printf(“%d\n”,::计数器/计数器); } },c++,C++,现在,我阅读了Scope Resolution操作符,我认为这将打印出全局变量计数器除以局部变量计数器。但是,程序会打印出以下内容: 2094374456 4195758 4195758 4195758 4195758 4195758 4195758 4195758 4195758 这些数字是什么?在这种情况下,范围解析操作符做什么 免责声明:我不懂C,但我在Java方面有丰富的经验。:counter确实指的是全局变量counter。此代码的问题是,除法的结果类型为double,因为其中一个参数
免责声明:我不懂C,但我在Java方面有丰富的经验。
:counter
确实指的是全局变量counter
。此代码的问题是,除法的结果类型为double
,因为其中一个参数为,double
值被传递给省略号,其中int
是预期值,因为格式说明符为%d
。这会导致未定义的行为。您需要将其更改为%f
::counter
确实引用了全局变量counter
。此代码的问题是,除法的结果类型为double
,因为其中一个参数为,double
值被传递给省略号,其中int
是预期值,因为格式说明符为%d
。这会导致未定义的行为。您需要将其更改为%f
您使用了错误的格式说明符::计数器
将是全局的计数器
,其类型为double
,因此除法的结果将为typedouble
,它应该通过%f
格式说明符或其他调用double的说明符(如%g
)打印
传递错误类型的数据将调用C中的未定义行为,但我不确定C++。
#include <stdio.h>
double counter = 50;
int main(){
for(int counter = 1; counter != 10; ++counter){
printf("%f\n",::counter/counter);
}
}
#包括
双计数器=50;
int main(){
用于(整数计数器=1;计数器!=10;++计数器){
printf(“%f\n”,::计数器/计数器);
}
}
您使用了错误的格式说明符::计数器
将是全局的计数器
,其类型为double
,因此除法的结果将为typedouble
,它应该通过%f
格式说明符或其他调用double的说明符(如%g
)打印
传递错误类型的数据将调用C中的未定义行为,但我不确定C++。
#include <stdio.h>
double counter = 50;
int main(){
for(int counter = 1; counter != 10; ++counter){
printf("%f\n",::counter/counter);
}
}
#包括
双计数器=50;
int main(){
用于(整数计数器=1;计数器!=10;++计数器){
printf(“%f\n”,::计数器/计数器);
}
}
您的:
正确。问题是您正在使用%d
打印双精度。打开编译器警告,它会告诉您问题所在。对于c++
使用std::cout
,它是类型安全的,而不是printf
,它会正确打印值。您正确地打印了:
。问题是您正在使用%d
打印双精度。打开编译器警告,它会告诉您问题所在。对于c++
使用std::cout
,它是类型安全的,而不是printf
,它会正确打印值。如果打开编译器警告,它将正确打印值可能也会对此发出警告。@TomKeddie:这取决于编译器在编译时是否支持对可变函数中的printf样式格式字符串进行解析。不是所有C++编译器都可以。谢谢我用一个树莓圆周率来做这件事,它编译时没有错误。奇怪的是,这本书怎么会把printfi搞得一团糟。如果打开编译器警告,它可能也会对此发出警告。@TomKeddie:这取决于编译器在编译时是否支持在变量函数中解析printf样式的格式字符串。不是所有C++编译器都可以。谢谢我用一个树莓圆周率来做这件事,它编译时没有错误。奇怪的是,这本书如何与PrtFFC混淆没有名称空间或范围分辨率,但即使在C++中,使用错误格式说明符仍然是未定义行为。但是,由于代码是使用范围解析C++,所以最好用<代码> STD::CUT< /COD>改写代码,而不是<代码> Primff()/Cuffe >,那么不存在类型不匹配的可能性:<代码>…STD::CUT C没有命名空间或范围解析,但是即使在C++中,使用错误格式说明符仍然是未定义行为。但是,由于代码是使用范围解析C++,所以最好用<代码> STD::CUT< /COD>改写代码,而不是<代码> Primff()/Cuffe >,那么不存在类型不匹配的可能性:<代码>…标准::cout