Java C修改函数中值的最佳方法
我用Java开发了几年,现在我想学习C,我注意到了一些不同之处 在Java中,当我想从函数返回某些内容时(例如,读取用户输入,我会编写Java C修改函数中值的最佳方法,java,c,function,return,assign,Java,C,Function,Return,Assign,我用Java开发了几年,现在我想学习C,我注意到了一些不同之处 在Java中,当我想从函数返回某些内容时(例如,读取用户输入,我会编写 String s; s = new Scanner(System.in).nextLine(); char s[20]; scanf("%d", name); 我会用C写 String s; s = new Scanner(System.in).nextLine(); char s[20]; scanf("%d", name); 区别在于,在Java
String s;
s = new Scanner(System.in).nextLine();
char s[20];
scanf("%d", name);
我会用C写
String s;
s = new Scanner(System.in).nextLine();
char s[20];
scanf("%d", name);
区别在于,在Java中,函数返回一个可以直接分配给变量的值,而在C中,函数将变量名作为参数(分别是指向变量的指针)
我在很多C函数中都注意到了这一点。当我编写自己的函数时,我应该像在Java中习惯的那样做,还是应该使用C风格的函数赋值/返回值?好吧,你应该知道C和Java之间的主要区别
Java
是面向对象编程
,而C
不是
在Java
中,几乎所有东西都是对象
(除了原语
)
你所谓的扫描器类
是一种非常糟糕的方法,
你应该这样做:
Scanner scanner= new Scanner(System.in);
然后调用它以获取字符串:
String s = scanner.nextLine();
原因是,每次调用新扫描仪(System.in)
时,您都会将扫描仪分配给相同的对象
,因此它将从系统的开始处重新开始。在中,您会一次又一次地获得相同的输入
但是在C
中,它不是这样的。因为这里没有您调用的对象
简而言之,只要记住在java
中,一切都是对其他事物的引用(cource的原始值除外),而在C中则不是这样
编辑:
就向方法发送参数而言,java可能很棘手,因为这取决于您是发送基本数据还是对象
因此,通常最好让方法返回一些东西,而不是发送需要设置为参数的数据
例如,看一看场景:
1. Example 1
public void addOne(int i){
i++;
}
public static void main(String... args){
int i=0;
addOne(i);
System.out.println(i);
}
output= 0;
2. Example 2
public int addOne(int i){
return i++;
}
//output = 1
public static void main(String... args){
int i=0;
i = addOne(i);
System.out.println(i);
}
你应该知道C和Java的主要区别
Java
是面向对象编程
,而C
不是
在Java
中,几乎所有东西都是对象
(除了原语
)
你所谓的扫描器类
是一种非常糟糕的方法,
你应该这样做:
Scanner scanner= new Scanner(System.in);
然后调用它以获取字符串:
String s = scanner.nextLine();
原因是,每次调用新扫描仪(System.in)
时,您都会将扫描仪分配给相同的对象
,因此它将从系统的开始处重新开始。在中,您会一次又一次地获得相同的输入
但是在C
中,它不是这样的。因为这里没有您调用的对象
简而言之,只要记住在java
中,一切都是对其他事物的引用(cource的原始值除外),而在C中则不是这样
编辑:
就向方法发送参数而言,java可能很棘手,因为这取决于您是发送基本数据还是对象
因此,通常最好让方法返回一些东西,而不是发送需要设置为参数的数据
例如,看一看场景:
1. Example 1
public void addOne(int i){
i++;
}
public static void main(String... args){
int i=0;
addOne(i);
System.out.println(i);
}
output= 0;
2. Example 2
public int addOne(int i){
return i++;
}
//output = 1
public static void main(String... args){
int i=0;
i = addOne(i);
System.out.println(i);
}
在C中只使用返回值进行操作时,最大的考虑是缺少异常。与Java不同,Java可以在常规调用/返回过程之外报告错误情况,C没有这样的功能。换句话说,Scanner
可以在没有下一行时抛出异常;scanf
没有我有这样的选择
如果您希望从函数返回错误状态,则仅限于(1)在静态变量中返回错误状态(并发性不安全),(2)将其作为返回值返回,或(3)在单独的“错误”对象中返回错误状态。有时选项(2)和(3)是组合的
因此,当状态作为返回值返回时,您经常会看到C API的结构可能会失败,如scanf
,而其余的值则通过指针修改
if (scanf("%d%d", &i, &j) == 2) {
... // Got 2 numbers
} else {
fprintf(stderr, "Wrong input! Expected two numbers.");
}
不会失败的API(例如,isalpha(ch)
或tolower(ch)
)直接返回它们的值。在C中只使用返回值进行操作时,最大的考虑是没有异常。与Java不同,Java可以在常规调用/返回过程之外报告错误情况,C没有这样的功能。换句话说,Scanner
可以在没有下一个l时抛出异常ine;scanf
没有这样的选项
如果您希望从函数返回错误状态,则仅限于(1)在静态变量中返回错误状态(并发性不安全),(2)将其作为返回值返回,或(3)在单独的“错误”对象中返回错误状态。有时选项(2)和(3)是组合的
因此,当状态作为返回值返回时,您经常会看到C API的结构可能会失败,如scanf
,而其余的值则通过指针修改
if (scanf("%d%d", &i, &j) == 2) {
... // Got 2 numbers
} else {
fprintf(stderr, "Wrong input! Expected two numbers.");
}
不失败的API(例如,isalpha(ch)
或tolower(ch)
)直接返回它们的值。Java是面向对象的,返回一个对象,该对象是指向该对象的指针
在C中,您也可以返回指针,但不能返回数组。您显示的C代码不正确,因为s(声明为指向字符的指针)未初始化。Scanf需要指向预分配缓冲区的指针作为第二个参数。它会将输入字符串写入缓冲区。我猜您的意思是Scanf(“%d”,s);
您编写的C代码将不起作用,因为s不指向存储字符的分配缓冲区。您可以将s定义为char s[1024];
,在这种情况下,s相当于指向1024个字符缓冲区的指针
您还可以定义sachar*s=malloc(1024*sizeof(char));
这将为s动态分配缓冲区。然后需要