int a=1;printf("%d,%d,%d",a++,a++,a++);结果

如题所述

==========================================================================

以下内容引自《C 语言常见问题集》 原著:Steve Summit 翻译:朱群英, 孙 云

http://c-faq-chn.sourceforge.net/ccfaq/index.html

http://www.eskimo.com/~scs/C-faq/top.html

==========================================================================

4.3 对于代码 int i = 3; i = i++; 不同编译器给出不同的结果, 有的为 3, 有的为 4, 哪个是正确的?

没有正确答案;这个表达式无定义。参见问题 3.1, 3.7 和 11.32。 同时注意, i++ 和 ++i 都不同于 i+1。如果你要使 i 自增 1, 使用 i=i+1, i+=1, i++ 或 ++i, 而不是任何组合, 参见问题 3.10。

12.35 有人说 i = i++ 的行为是未定义的, 但是我刚在一个兼容 ANSI 的编译器上测试, 得到了我希望的结果。

面对未定义行为的时候, 包括范围内的实现定义行为和未确定行为, 编译器可以做任何实现, 其中也包括你所有期望的结果。但是依靠这个实现却不明智。参加问题 7.4, 11.31, 11.32 和 11.34。

4.2 使用我的编译器,下面的代码 int i=7; printf("%d\n", i++ * i++); 返回 49?不管按什么顺序计算, 难道不该打印出56吗?

尽管后缀自加和后缀自减操作符 ++ 和 -- 在输出其旧值之后才会执行运算, 但这里的``之后"常常被误解。没有任何保证确保自增或自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表达式 ``完成" (按照 ANSI C 的术语, 在下一个 ``序列点" 之前, 参见问题 3.7) 之前的某个时刻进行。本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自增运算。

包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, ``多个不确定副作用" 是指在同一个表达式中使用导致同一对象修改两次或修改以后又被引用的自增, 自减和赋值操作符的任何组合。这是一个粗略的定义; 严格的定义参见问题 3.7, ``未定义" 的含义参见问题 11.32。) 甚至都不要试图探究这些东西在你的编译器中是如何实现的 (这与许多 C 教科书上的弱智练习正好相反); 正如 K&R 明智地指出, ``如果你不知道它们在不同的机器上如何实现, 这样的无知可能恰恰会有助于保护你。

4.7 我怎样才能理解复杂表达式?``序列点" 是什么?

序列点是一个时间点(在整个表达式全部计算完毕之后或在 ||、 &&、 ? : 或逗号 运算符处, 或在函数调用之前), 此刻尘埃落定, 所有的副作用都已确保结束。 ANSI/ISO C 标准这样描述:

在上一个和下一个序列点之间, 一个对象所保存的值至多只能被表达式的计算修改一次。而且前一个值只能用于决定将要保存的值。

第二句话比较费解。它说在一个表达式中如果某个对象需要写入, 则在同一表达式中对该对象的访问应该只局限于直接用于计算将要写入的值。这条规则有效地限制了只有能确保在修改之前才访问变量的表达式为合法。例如 i = i+1 合法, 而 a[i] = i++ 则非法 (参见问题 3.1)。

参见下边的问题 3.8。
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-02-10
先执行该输出语句,输出1,1,1,然后a再自行加一;,a++,a++,a++)a++的意思是先执行当前语句再进行自行加一,所以当有int
a=1;printf("%d,%d,%d"时,此时a的值为3
第2个回答  2019-10-12
这个根据不同的编译器会有不同的结果,有的编译器认为逗号是表达式的分隔,有的不认为,标准C里没有关于这样的定义。所以你知道就行了

int a=1;printf("%d,%d,%d",a++,a++,a++);结果
a++表示在使用a的当前值调用a++所在行代码后再将a的值累加1。你这段代码运行的结果就是三个1。

int a=1;printf('%d,%d,%d",a++,a++,a++);结果
4.3 对于代码 int i = 3; i = i++; 不同编译器给出不同的结果, 有的为 3, 有的为 4, 哪个是正确的?没有正确答案;这个表达式无定义。参见问题 3.1, 3.7 和 11.32。 同时注意, i++ 和 ++i 都不同于 i+1。如果你要使 i 自增 1, 使用 i=i+1, i+=1, i++ 或 +...

int a=1; printf("%d, %d, %d\\n", a, ++a, a++);结果是
执行int a=1; printf("%d, %d, %d\\n", a, ++a, a++)的结果为3,3,1。这个语句的输出结果不是唯一的,因为对于求值的顺序是不一定的,所以说还有可能输出的结果为1,2,2。当求值的顺序为自右向左是,那么a++先引用1然后再加1,会输出1,然后++a是先加1再引用,会输出3这个结果,最...

...int a=1; printf("%d, %d, %d\\n", a, ++a, a++);
结果是 3,3,1 因为printf执行的时候是从右往左的,先算a++ 再算++a 最后算a ;第一步 执行完a++之后 输出1,a的结果是2;第二步 执行++a,先自加再使用 输出3,a的结果是3;第三步 直接输出a ,即 输出3

c语言如何理解 printf('%d,%d,%d",a++,a++,a++)
根据你的问题,下了一个程序如下,你知道程序运行的结果是怎样的吗?main(){ int a=1;printf("%d,%d,%d\\n",a++,a++,a++);printf("%d\\n",a);} 运行后的结果如下,你能明白吗?3,2,1 4 这个语句是明白了会明白C语言里面两个难懂的东西:printf("%d,%d,%d\\n",a++,a++,a++);首...

printf("%d,%d,%d,\\n",a++,a,++a)
运行结果如图所示:由于操作数据变化,执行顺序不同,其结果不同。三者联合操作与单独执行效果又不一样,单独执行效果如下:

...void main() { int a =1; printf("%d,%d\\n",a,++a); } 为什么输出...
与函数调用约定的入栈顺序,一集求值顺序有关 printf是标准的__cdecl,参数自右向左入栈 但是求值顺序是语言标准中没有规定的,所以这个实际上的未定义行为

C语言a=1 printf("%d",a++)答案是什么
答案是1 a++是先把a的值带进运算在自加1 ++a是先自加1,在吧a的值带入运算 如果是 a=1 printf("%d",++a)那么就是2了 希望对你有帮助!!

c语言如何理解 printf('%d,%d,%d",a++,a++,a++)
那么结果是3个06: printf("%d,%d,%d",a++,a++,a++);00410A1F mov eax,dword ptr [ebp-4]00410A22 mov dword ptr [ebp-8],eax 00410A25 mov ecx,dword ptr [ebp-8]00410A28 push ecx 00410A29 mov edx,dword ptr [ebp-4]00410A2C mov dword...

Int a=1;printf("%d",a++)输出的是1还是2?
int a=1;printf("%d",a++)输出的是1 因为它是“后自加”,就是先取用a的值,然后 a再自加。

相似回答
大家正在搜