函数和参数给出错误

时间:2015-03-20 06:24:52

标签: 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 ;
}


void add(int a, int b){
    int result = a + b;
    printf("the result of the %d and %d is %d, a, b, result");  
}

5 个答案:

答案 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()

man page
  

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上)最近GCCClang/LLVM-Wall -Wextra -g传递给gccclang命令(以获得几乎所有警告,一些额外的和调试信息)。其他编译器选项(-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中),您最终会编写一些虚拟或抽象机器,而不是真正的计算机。即使从包含的操作系统内核编写所有软件级别 - 至少需要几十年的时间 - ,您正在编写一些指定的抽象并且您必须忽略计算机的某些不当行为(例如,如果它破裂,得到一些宇宙射线等等......)在这些抽象之外。 C99C11编程语言标准规范(英文数百页的技术文档),具有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返回字符数