为什么printf("j=%d,k=%d,f=%f\n",j),k,f; 可以通过编译?

imdjs 2019-06-10 12:41:13
我使用vc14编译以下代码:
int j=3,k=4;float f=0.6;
printf("j=%d,k=%d,f=%f\n",j),k,f; //这句本来应该写成printf("j=%d,k=%d,f=%f\n",j,k,f); 不小心写错了

因为不小心把printf函数写错了,但竟然可以通过编译,结果引致这句下面 的代码编译通过,但运行时莫名出错,而且找不到原因,这个printf貌似跟一般函数不一样.如果是用其它自定义函数代码它这样写一定会报错不能通过编译,虽然没有深入了解printf函数,但是这种写错的情况难道不是应该会报错吗?
这里用简单main测试了一下.可以通过编译.
...全文
190 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
imdjs 2019-06-10
  • 打赏
  • 举报
回复
谢谢,学习了.
赵4老师 2019-06-10
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
六道佩恩 2019-06-10
  • 打赏
  • 举报
回复
这里是k和f被当成了两个表达式,即它们和“a=1”"b=a+c"这样的表达式没有区别,然后,函数调用也是一个表达式,它和k和f三个表达式被两个逗号连成了一个语句。 至于printf内部,编译器不会检查你双引号里%d的数量,对于这个代码,你只传给printf一个变量j,至于多出来的两个%d,理论上显示乱码。
lin5161678 2019-06-10
  • 打赏
  • 举报
回复
哈哈 题主误打误撞 发现这个问题 不过的确是好问题 涉及到一种特殊函数 不定参数函数 详细内容可以百度搜索
引用
C 不定参数函数
赵4老师 2019-06-10
  • 打赏
  • 举报
回复
上pc_lint
gouyanfen 2019-06-10
  • 打赏
  • 举报
回复
printf("<格式化字符串>", <参量表>)。printf解析格式化字符串是在函数内部分解的,编译器并不参与分解格式化字符串,所以不会在编译时出错。 ,也是表达式 int a,b,c; a,b,c; a+b,a+c,b+c; 这样是可以的,而且不会有问题 a=(b,c);结果是a=c

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧