C 给出错误的函数和参数
下面这段代码的结果应该是30,但是当编译和运行时,这会给我以下结果C 给出错误的函数和参数,c,printf,C,Printf,下面这段代码的结果应该是30,但是当编译和运行时,这会给我以下结果 the result of 2358968 and 0 is 4200271, a , b , result 我 我不明白当我没有那个值的变量时,结果怎么会是这样 #include<stdio.h> #include<conio.h> void add( int , int ); int main(){ add(10,20); getch(); return 0 ; }
the result of 2358968 and 0 is 4200271, a , b , result
我
我不明白当我没有那个值的变量时,结果怎么会是这样
#include<stdio.h>
#include<conio.h>
void add( int , int );
int main(){
add(10,20);
getch();
return 0 ;
}
void add(int a, int b){
int result = a + b;
printf("the result of the %d and %d is %d, a, b, result");
}
#包括
#包括
无效添加(int,int);
int main(){
增加(10,20);
getch();
返回0;
}
无效添加(内部a、内部b){
int结果=a+b;
printf(“%d和%d的结果是%d,a,b,result”);
}
在您的代码中
printf("the result of the %d and %d is %d, a, b, result");
应该是
printf("the result of the %d and %d is %d\n", a, b, result);
^
|
//format string ends here
// arguments for format specifiers are meant to be
// supplied as different arguments to `printf()`, not as a part of <format> string itself
printf("<format>", var1, var2,....);
提供的变量不是格式的一部分
代码中的问题是缺少所提供格式说明符的变量(参数)。根据C11
标准第7.21.6.1章第2段
[…]如果格式的参数不足,则该行为为
未定义。[……]
因此,您的代码会打印出一些垃圾值
故事的寓意:如果启用了编译器警告,编译器应该警告您printf()
中缺少(不匹配)图形。因此,请始终启用警告。对您的大多数问题;他正确地建议在编译时启用所有警告。如果您的编译器(尤其是在Linux上)是最新的或将-Wall-Wextra-g
传递到gcc
或clang
命令(以获取几乎所有警告、一些额外警告和调试信息)。其他编译器选项(-fsanize=address
等)和其他工具(gdb
调试器、工具,strace
,…)也可能有用
我不明白当我没有这个值的变量时
结果会是这样吗
#include<stdio.h>
#include<conio.h>
void add( int , int );
int main(){
add(10,20);
getch();
return 0 ;
}
void add(int a, int b){
int result = a + b;
printf("the result of the %d and %d is %d, a, b, result");
}
因为你遇到过。阅读更多关于它的信息(特别是Lattner的博客),并努力在任何情况下都避免它。请注意,使用UB时,您的(或任何其他)程序似乎可以工作,但实际上它有一些未定义的行为
打印的特定垃圾(或明显随机)值:可能不可复制,只能通过深入了解每个实现细节来解释,包括查看特定编译器生成的机器代码和检查某些机器状态(寄存器值);具体来说,系统上的printf
实现可能使用了一些东西,并从未初始化的内存或寄存器中获取了一些值,而这些内存或寄存器恰好具有一些以前的“垃圾”值(在机器级别)
另请参见(以及许多其他)关于未定义行为的内容。努力工作,总是避免它。
记住,当编码(即使是C)时,你最终是在为一些虚拟或抽象机器编码,而这些机器不是真正的计算机。即使从操作系统内核中编写所有软件级别(至少需要几十年时间),您也在为某些特定的抽象编写代码,您必须忽略计算机在这些抽象之外的一些错误行为(例如,如果计算机发生故障,获取一些宇宙射线等)。或编程语言标准规范(几百页的英文技术文档)以及操作系统规范是编写软件代码的有用抽象。printf语句是产生不希望的输出的原因
printf("the result of the %d and %d is %d, a, b, result");
没有为格式说明符指定参数,必须更改“
的位置
声明应该是这样的
printf("the result of the %d and %d is %d", a, b, result);
在printf语句中,它接受的是垃圾值,因为没有为%d
指定任何参数。您已经关闭了行末尾的“
。在printf
函数中,您指定了%d
,因此%d
将不具有指向和获取值的变量
您将收到警告消息,%d需要匹配的int
它将在该位置有垃圾值,因此它正在打印一些值。printf(“%d和%d的结果是%d,a,b,result”);
一定是这样
printf(“第%d个和第%d个的结果是第%d个”,a,b,result);
它将从左侧读取并分配%d值以进行写入。
printf返回字符数没有帮助,只需添加一个换行符,值将如何变化?@PratikRatnaparkhi是您注意到的唯一变化吗?如果是的话,那么,请仔细看看。:-)色盲模式下语法高亮显示的替代方法是什么?:)我要找的答案是30,我得到一些随机值,即使在添加新行后,您还没有关闭“在你的代码中?我很困惑。嘿,对不起。我现在得到了答案,但你能解释一下为什么早些时候它给了我这样一个随机值吗?如果它还说了未定义的行为是什么,答案会更好。我给了一个维基百科的链接。UB太难用几句话来解释,真的吗?“您使用了一个vararg函数,但没有根据格式字符串中给出的信息给出适当数量的参数”@user2225104在我的回答中添加了一些描述。请检查这是否有帮助。
printf(“%d和%d的结果是%d\n”,a,b,result)代码>