Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C修改函数中值的最佳方法_Java_C_Function_Return_Assign - Fatal编程技术网

Java C修改函数中值的最佳方法

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

我用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中,函数返回一个可以直接分配给变量的值,而在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个字符缓冲区的指针

您还可以定义sa
char*s=malloc(1024*sizeof(char));
这将为s动态分配缓冲区。然后需要