::(范围解析运算符)在此程序中执行什么操作? 我现在正在学习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++,在我读一本书的时候看到这个程序。 #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,因为其中一个参数

现在,我阅读了Scope Resolution操作符,我认为这将打印出全局变量计数器除以局部变量计数器。但是,程序会打印出以下内容:

2094374456

4195758

4195758

4195758

4195758

4195758

4195758

4195758

4195758

这些数字是什么?在这种情况下,范围解析操作符做什么


免责声明:我不懂C,但我在Java方面有丰富的经验。

:counter
确实指的是全局变量
counter
。此代码的问题是,除法的结果类型为
double
,因为其中一个参数为,
double
值被传递给省略号,其中
int
是预期值,因为格式说明符为
%d
。这会导致未定义的行为。您需要将其更改为
%f
::counter
确实引用了全局变量
counter
。此代码的问题是,除法的结果类型为
double
,因为其中一个参数为,
double
值被传递给省略号,其中
int
是预期值,因为格式说明符为
%d
。这会导致未定义的行为。您需要将其更改为
%f

您使用了错误的格式说明符
::计数器
将是全局的
计数器
,其类型为
double
,因此除法的结果将为type
double
,它应该通过
%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
,因此除法的结果将为type
double
,它应该通过
%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