为了账号安全,请及时绑定邮箱和手机立即绑定

C中调用函数之前的参数求值顺序

C中调用函数之前的参数求值顺序

C
手掌心 2019-06-14 16:53:14
C中调用函数之前的参数求值顺序在C中调用函数参数时,可以假定函数参数的赋值顺序吗?根据下面的程序,当我执行它时,似乎没有一个特定的命令。#include <stdio.h>int main(){    int a[] = {1, 2, 3};    int * pa;     pa = &a[0];    printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa), *(pa++),*(++pa));    /* Result: a[0] = 3  a[1] = 2    a[2] = 2 */    pa = &a[0];    printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa++),*(pa),*(++pa));    /* Result: a[0] = 2  a[1] = 2     a[2] = 2 */    pa = &a[0];    printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa++),*(++pa), *(pa));    /* a[0] = 2  a[1] = 2 a[2] = 1 */}
查看完整描述

3 回答

?
www说

TA贡献1775条经验 获得超8个赞

不,函数参数在C中没有按定义的顺序计算。

见马丁·约克对c+程序员应该知道的所有常见的未定义行为是什么?.


查看完整回答
反对 回复 2019-06-14
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

函数参数的计算顺序未指定,参见C99§6.5.2.2p10:

函数指示符、实际参数中的实际参数和子表达式的计算顺序未指定,但在实际调用之前有一个序列点。

C89中也有类似的措辞。

此外,您正在修改pa多次没有调用未定义行为的序列点(逗号运算符引入序列点,但分隔函数参数的逗号不引入)。如果您打开编译器上的警告,它应该警告您:

$ gcc -Wall -W -ansi -pedantic test.c -o test
test.c: In function ‘main’:test.c:9: warning: operation on ‘pa’ may be undefined
test.c:9: warning: operation on ‘pa’ may be undefined
test.c:13: warning: operation on ‘pa’ may be undefined
test.c:13: warning: operation on ‘pa’ may be undefined
test.c:17: warning: operation on ‘pa’ may be undefined
test.c:17: warning: operation on ‘pa’ may be undefined
test.c:20: warning: control reaches end of non-void function


查看完整回答
反对 回复 2019-06-14
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

只是为了增加一些经验。
以下代码:

int i=1;printf("%d %d %d\n", i++, i++, i);

结果

2 1 3-在Linux.i 686上使用g+4.2.1
1 2 3-在Linux.i 686上使用SunStudio C+5.9
2 1 3-在SunOS.x86pc上使用g+4.2.1
1 2 3-在SunOS.x86pc上使用SunStudio C+5.9
1 2 3-在SunOS.sun4u上使用g+4.2.1
1 2 3-在SunOS.sun4u上使用SunStudio C+5.9


查看完整回答
反对 回复 2019-06-14
  • 3 回答
  • 0 关注
  • 572 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信