c语言printf求值顺序,VC下 printf 参数列表 运算顺序

1,VC下 printf 参数列表 运算顺序正常情况下,是从左向右运算的,如:int i=5;int j=4;printf("%d+%d=%d",i,j,i+j);结果输出:5+4=9如果上面的参数不是简单的表达式,而是复杂的表达式 。如:i*j+i*i/j则是根据vc内的符号运算优先顺序先运算出结果,再送入printf函数再输到屏幕上 。
2,printf的变量列表一定是从右到左的求值顺printf只是一个库函数,并不是什么运算符,所以没必要规定执行顺序 。不要浪费时间在这个上面,避免写出需要执行顺序的语句才是应该做的 。这里执行的顺序由编译器决定,你输出的顺序只是其中一种可能性 。比如说:int i=5;printf("%d %d", i, ++i);使用从左到右的编译系统 , 输出:5 6,而使用从右到左的编译系统 , 则输出:6 6 。
3,C语言中printf顺序是从右往左吗计算是从右往左,输出是从左往右main();float fahr,celsius;float lower,upper,step;把程序改为这样运行是一样错误,就是float前面出线分号语句 , 就没法定义了,第一个定义不好第二个跟着没法定义实例看看左到右吧输出时顺序的吧【c语言printf求值顺序,VC下 printf 参数列表 运算顺序】
4,c语言printf函数运算顺序为什么从右到左不是printf函数运算顺序为什么从右到左,而是类似的所有函数,包括算定义函数的参数计算都是从右至左 。函数数有多个参数时计算总得有个顺序吧?不是从左至右 , 就是从右至左,抑或从中间向两边;一句话选定一个顺序后就“大家都这么办”,总不能有些函数从左至右,有些函数从右至左吧,那编译器就太难做了 。当初选择从右至左肯定是这样有好多方便之处 , 比如printf中的参数表,由于C是基于栈操作的,栈又是后进先出的,从右至左计算压栈,然后按弹出顺序输出到屏幕上刚好顺应了大多数文本从左至右的习惯,很是方便;若从左至右计算压栈,那也不是说不可以,但处理就没有这么方便了 。个人管见,供参考 。这是因为在c语言调用时 , 参数需要用堆栈传递,而参数压栈顺序是从右到左的#include <bits/stdc++.h>using namespace std; int main()int a=-1;printf("%d\n",(a>0)+(a=1)); }如上代码输出1 。说明a>0先被计算因为其内部是从右往左排 的~~~~从汇编角度来看,函数的参数总是从高地址压到低地址,而访问参数的时候又是通过基址加偏移量来的 , 所以按照逻辑,偏移量为0对应第一个参数 , 第一个参数在低地址,低地址最后压入栈 , 相对应的函数最右边的参数也就最先计算,并先压入栈 。5,C语言printf函数求值顺序问题对于printf函数而言,它们都是参数 , 没有什么顺序的 。问题出现在++的位置你就记得这个原则就行了++在前时,就将加法操作放到这句话的前面,同理,在后面时,就放到这句话的后面举例:printf("%d,%d\n",i,++i);等价于i = i + 1;printf("%d,%d\n",i,i);printf("%d,%d\n",i,i++);等价于printf("%d,%d\n",i,i);i = i + 1;所以不管以后有多复杂的,只要这样替换就可以了 比如printf("%d,%d\n",--i,i++);等价于i = i - 1;printf("%d,%d\n",i,i); // 打印的就是i减去1的值。就算是printf("%d,%d\n",i++,--i);也一样i = i + 1;看编译系统而定 , 有的自左至右,有的自右至左&是取地址,就是让你反a的地址打印出来,再找出原因喽#include <stdio.h>int main() int i = 100; printf("%d\n%d\n",i,&i);//你打印出来就知道了,还有你的引号注意别掉了 return 0;}++i 和 i++ 是不同的 , ++在前,先自增1,然后使用i,++在后 , 先使用i,在自增1.i++是先参与表达式运算,再自加;++i是先自加 , 再参与表达式运算嗯,这和printf函数无关;而是和运算符优先顺序有关;一共有十五个优先级:1 () [] . ->2 ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof3 * / %4 + -5 >> <<6 > >= < <=7 == !=8 &9 ^10 |11 &&12 ||13 ?:14 = += -= *= /= %= |= ^= &= >>= <<=15 ,

    推荐阅读