下面这段代码的结果应该是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 ;
}
void add(int a, int b){
int result = a + b;
printf("the result of the %d and %d is %d, a, b, result");
}
答案 0 :(得分:6)
在您的代码中,
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()
int printf(const char * format,...);
和
生成输出
printf()
系列中的函数根据format
....
所以基本上你的代码应该是
printf("<format>", var1, var2,....);
提供的变量是 不 format
的一部分。
代码中的问题是缺少提供的格式说明符的变量(参数)。根据{{1}}标准,第7.21.6.1章,第2段
[...]如果格式的参数不足,则行为为 未定义。 [...]
因此,您的代码会生成undefined behaviour打印出一些垃圾值。
故事的道德:如果您启用了编译器警告,编译器应该警告您C11
中缺少(不匹配)的评论。所以,始终启用警告。
答案 1 :(得分:2)
Sourav Ghosh answered你的大部分问题;他正确地建议在编译时启用所有警告。如果您的编译器(特别是在Linux上)最近GCC或Clang/LLVM将-Wall -Wextra -g
传递给gcc
或clang
命令(以获得几乎所有警告,一些额外的和调试信息)。其他编译器选项(-fsanitize=address
等等...)和其他工具(gdb
调试器,valgrind工具,strace
,...)也可能有用!
我不明白,当我没有那个值的变量时,怎么可能 结果是那样的?
因为您遇到了undefined behavior。阅读更多相关内容(特别是关于What Every C Programmer should know about Undefined Behavior的Lattner博客),并努力在所有情况下始终避免使用它。请注意,对于UB,您的(或任何其他)程序似乎可能有效,而实际上它有一些未定义的行为。
打印的特定垃圾(或显然是随机的)值:可能无法重现,只能通过深入了解每个实现细节来解释,包括查看特定编译器生成的机器代码并检查某些机器状态(登记价值);具体来说,系统上的printf
实现可能正在使用一些stdarg(3)内容并从未初始化的内存或注册中获取某些值。 &#34;垃圾&#34;价值(在机器级别)。
另请参阅this answer(和许多其他人)有关未定义行为的信息。努力工作以避免它。 请记住,在编码时(即使在C中),您最终会编写一些虚拟或抽象机器,而不是真正的计算机。即使从包含的操作系统内核编写所有软件级别 - 至少需要几十年的时间 - ,您正在编写一些指定的抽象并且您必须忽略计算机的某些不当行为(例如,如果它破裂,得到一些宇宙射线等等......)在这些抽象之外。 C99或C11编程语言标准规范(英文数百页的技术文档),具有POSIX 2008操作系统规范,是编写软件代码的有用抽象。
答案 2 :(得分:2)
您已关闭该行末尾的"
。在printf
函数中,您指定了%d
因此%d
将不会有变量指向并获取值。
您将收到%d expects a matching int
它将在该位置具有垃圾值,因此它正在打印一些值。
答案 3 :(得分:1)
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
指定参数,因此它占用了垃圾值。
答案 4 :(得分:0)
printf(&#34;%d和%d的结果是%d,a,b,结果&#34;); 它一定要是 printf(&#34;%d和%d的结果是%d&#34;,a,b,结果); 它将读取并从左侧分配%d值以进行写入。 printf返回字符数