我试图创建一个输入两个数字并输出其总和的程序.为此,我必须使用两个变量.我只是好奇这是否可以通过只使用一个变量来完成.
注意:用户必须输入两个数字.
#include<stdio.h>
int main()
{
int a, b;
scanf("%d%d",&a,&b);
printf("%d",(a+b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ron*_*ron 11
#include <stdio.h>
int main ( void )
{
int a[3];
scanf("%d", &a[0]); /* first number */
sscanf("%d", &a[1] ); /* second number */
a[2] = a[0] + a[1];
printf("sum is %d\n", a[0] + a[1] );
printf("sum stored in a[%d] is %d\n", 2, a[2] );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
技术上一个变量,一个指针:
#include<stdio.h>
int main() {
int *nums = malloc(2 * sizeof(int));
scanf("%d%d",nums, (nums + sizeof(int)));
printf("%d",(*nums + *(nums + sizeof(int))));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,没有一种优雅的方法可以将一个变量用于两个输入.
请注意,我认为问题就像挑战或谜题.不要认为这个答案好C练习.显然,从输入中得出2个值之和的最简洁方法是使用2个变量.我仍然觉得挑战很有趣.
#include <stdio.h>
#include <math.h>
int main()
{
int a;
printf("%g", fmin((scanf("%d", &a), a), 1.0/0.0 + rand()) + fmin((scanf("%d", &a), a), 1.0/0.0 + rand()));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用负值.
我正在使用逗号运算符执行两个表达式但只返回第二个表达式.所以(scanf("%d", &a), a)就像打电话scanf("%d", &a)和退货一样a.我通过函数(任何函数)传递此结果,因为我想阻止更新值(用新的a求和).我不知道你的编译器是否会首先调用大表达式的左侧或右侧部分,但它们无关紧要,因为它们都在做同样的事情.无论哪个先执行都将是输入的第一个值.
fmin(x, 1.0/0.0 + rand())确保编译器不会内联任何内容.1.0/0.0是无限,fmin()在我们的情况下永远不会返回.编译器会将此内联x正常,但添加+ rand()到Infinity(仍然是Infinity)似乎会阻止它.
您甚至可以通过使用argc声明"0"变量来实现:
#include <stdio.h>
#include <math.h>
int main(int a)
{
printf("%g", fmin((scanf("%d", &a), a), 1.0/0.0 + rand()) + fmin((scanf("%d", &a), a), 1.0/0.0 + rand()));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用它来测试:https://www.onlinegdb.com/online_c_compiler
在C中仅使用一个变量添加两个数字
使用1变量创建辅助函数.
#include <stdio.h>
int scan_int(void) {
int a;
if (scanf("%d", &a) == 1) {
return a;
}
return 0;
}
int main(void) {
printf("Sum %d\n", scan_int() + scan_int());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意scan_int() + scan_int(),代码可以先调用左边或右边scan_int()(或并行).幸运的+是可交换,所以这里没有区别.
这里的"技巧"是按顺序或并行存在,a 1st_call_scan_int::a和2nd_call_scan_int::a.代码中仍然只有一个变量.