为什么没有像scanf这样的说明符格式或者&符号?

时间:2015-09-22 22:22:07

标签: c++ c

int a;

在C ++中,为什么没有

cin >> a;

需要&符号

scanf("%d", &a);

在C?

4 个答案:

答案 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)

cini通过引用传递给operator >>,因为它能够读写cini

由于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;
}