C 打印位数而不是实际值

C 打印位数而不是实际值,c,cs50,C,Cs50,我对C语言和代码都是新手,如果这是一个简单的问题,我很抱歉 我所要做的就是输入一些数字,让它们相加,然后用两种不同的方式打印总和。但是由于某种原因,printf(“%li”,z)代码行仅打印数字中的位数加上1 有人能给我解释一下为什么它会这样做吗?为什么什么是重要的,我其实并不太在意它的工作,因为我只是在玩耍和练习。谢谢 我的代码如下: #include <cs50.h> #include <stdio.h> int main(void) { long x =

我对C语言和代码都是新手,如果这是一个简单的问题,我很抱歉

我所要做的就是输入一些数字,让它们相加,然后用两种不同的方式打印总和。但是由于某种原因,
printf(“%li”,z)代码行仅打印数字中的位数加上
1

有人能给我解释一下为什么它会这样做吗?为什么什么是重要的,我其实并不太在意它的工作,因为我只是在玩耍和练习。谢谢

我的代码如下:

#include <cs50.h>
#include <stdio.h>

int main(void) {
    long x = get_long("what is x: ");
    long y = get_long("what is y: ");
    long z = printf("%li\n", x + y + y);
    printf("%li", z);
}
#包括
#包括
内部主(空){
long x=get_long(“x是什么?”);
长y=get_long(“y是什么?”);
长z=printf(“%li\n”,x+y+y);
printf(“%li”,z);
}

错误就在这一行

long z = printf("%li\n", x + y + y);
原因
printf(“%li”,z)
打印数字中的位数加一是
printf
是一个函数,返回写入输出流(stdout——在您的情况下是控制台)的字符数,这里是
printf(“%li\n”,x+y+y”)
您正在尝试写入
x+y+y
,后跟
\n
(这是一个附加字符)

printf
在名为
stdout
的文件上打印格式化字符串。阅读更多细节

请注意,如果您是C语言新手,我建议您不要在没有适当基础知识(变量、指针、动态内存分配、文件)的情况下尝试学习更多“高级”内容,如
printf
scanf
(和
*printf
*scanf
函数族)。如果您想尝试小程序,看看它们是否成功,您可以使用调试器(
gdb
)。但是为了理解这些函数的使用,你需要知道一些基本的东西,否则你会得到像
scanf(“%s%d”,mystr,&myint)
这样的神奇语法,你不知道为什么
mystr
不需要
&
,而
myint
需要。因此,如果您没有这些基础知识,请先学习它们,然后再继续对文件执行IO操作(stdout和stdin都是文件)。

\include
#包括
内部主(空)
{
long x=get_long(“x是什么?”);
长y=get_long(“y是什么?”);
长z=x+y+y;
printf(“%li”,z);
}

printf的返回值是打印的字符数,而不是打印值本身。(这是不可能的。
printf(“Hi!”)
printf(“%s,%s!”,a,b)
的值应该是多少?)
printf()
返回打印的字符数,它是+1,因为您打印了
换行符
字符。您查看了文档中的字符吗?返回值是传输到“想要”的输出流的字符数(对于“想要”的合适定义):
long z;printf(“%li\n”,z=x+y+y);printf(“%li\n”,z)谢谢你的详细回答,我真的很感激!我会调查其他事情,我在自学,所以是的,我错过了所有这些。@UgaBuga,不客气。许多书籍和教程使用
printf
scanf
而没有解释指针和正确理解它们所需的其他重要内容。如果你找不到好的书从基础开始解释,至少要记住那些IO函数使用1。文件(stdout和stdin)2。指针3。可变参数;因此,一开始不完全理解它们的作用是很自然的,但是当你读完你的书后,回到那些函数,并理解这些函数下没有魔法。还有一件事:使用调试器检查变量可能比使用
printf
,更耗时(更抽象),但在我看来,花更多的时间和精力是值得的。如果您发现自己被调试器卡住了,我个人的建议是只在开始时使用
printf
,然后硬编码所有其他内容(或使用参数:),至少在您研究文件IO之前是这样。