有
int a;
在C ++中,为什么没有
cin >> a;
需要&符号
scanf("%d", &a);
在C?
答案 0 :(得分:5)
在C ++中,我们不仅有变量和指针(如在C中),还有引用。在调用方面,传递引用看起来像是按值传递变量,但是在被调用函数的一侧,它实际上不接收副本,而是接收实际变量,因此可以改变它。您可以将引用视为指针,但无需取消引用。
std::istream& operator>> (std::istream&i, some_type&x);
声明一个运算符,该运算符引用std::istream
而另一个引用some_type
并返回std::istream
引用。通过此声明,您现在可以
some_type x;
std::cin >> x; // calls above operator, pasing x by reference
通过引用传递和通过指针传递非常相似,实际上可能产生相同的代码:
void f1(int*x) { *x=2; }
void f2(int&x) { x=2; }
int a;
f1(&a); // is equivalent
f2(a); // to this
C ++中的常识是传递不能通过值(如果它们适合单个寄存器)或const
引用而改变的变量。可以通过(非 - const
)引用或指针传递的变量可以通过(非 - const
)引用或者指针传递,这是样式的问题:后者在函数调用时显式可以改变变量,而前者(通过引用传递)需要一个查找函数的API,以确定是否通过值,引用或2015_09_22
|____ foo
|____ common.ext
|____ common.1.ext
|____ common.2.ext
|____ common.3.ext
|____ bar
|____ common.ext
|____ common.1.ext
|____ common.2.ext
引用。
答案 1 :(得分:4)
cin
和i
通过引用传递给operator >>
,因为它能够读写cin
和i
。
由于C没有真正的引用传递,scanf("%d", &a);
代码需要传递a
scanf()
的地址才能将值写入a
。
答案 2 :(得分:1)
当传递不同类型的参数时,C和C ++使用根本不同的方法。
在C中,像scanf(const char* pattern, ...)
这样的单个函数可以接受许多不同类型的参数。这就是为什么它需要一个pattern
参数,你可以告诉它它收到的实际类型。如果您传递任何意外情况,则会出现运行时问题。
在C ++中,可以针对不同类型的参数重复实现单个函数 name 。这称为重载。每个重载的实现都将确切地知道它所期望的内容,并且编译器将确保它只获得该类型的值。如果没有匹配的重载,则会出现编译时错误。
另一个区别是,在C ++中,cin >> i
实际上是operator>>
的函数调用。在C中,函数调用看起来都像functionName(argument)
答案 3 :(得分:0)
你可以在c ++中使用scanf,但是如何更好地使用cin。 " cin>>" not" cin<<"
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
float x;
scanf("%f",&x);
printf("%.1f",x);
return 0;
}