Tag: 评估顺序

确定“未知的评估顺序”

从版本1.80开始,Cppcheck告诉我 表达式’msg [ipos ++] =校验和(&msg [1],ipos-1)’取决于副作用的评估顺序 在此代码序列中(简化, data是变量) BYTE msg[MAX_MSG_SIZE]; // msg can be smaller, depending on data encoded int ipos = 0; msg[ipos++] = MSG_START; ipos += encode(&msg[ipos], data); msg[ipos++] = checksum(&msg[1], ipos-1); // <—- Undefined Behaviour? msg[ipos++] = MSG_END; // increment ipos to the actual size of msg 并将此视为错误,而不是可移植性问题。 它是C代码(包含在C ++主导的项目中),使用C ++ 98兼容编译器编译,同时按预期运行数十年。 […]

C 中逻辑运算符的优先级

可能重复: 为什么“++ x || ++ y && ++ z“计算”++ x“首先? 但是,运算符“&&”高于“||” 如果你看一下C的优先级表,你会发现&&的优先级高于||。 但请看下面的代码: a=b=c=1; ++a || ++b && ++c; printf(“%d %d %d\n”,a,b,c); 它打印出“2 1 1”,这意味着首先评估“++ a”,一旦程序看到TRUE,它就会停在那里,因为在||的另一边是什么 并不重要。 但由于&&的优先级高于||,所以不应首先评估“++ b && ++ c”,然后将结果插回“++ a || result”? (在这种情况下,程序将打印“1 2 2”)。

将首先评估表达式的右侧

右侧是否会一直评估在左侧之前? 然后右侧的结果将传递到左侧。 我不是在谈论A[i]=i++等exception 我说的是正常情况: A[i] = (j+32+43 & K); A[j] != (A[j] + A[k]); 首先评估所有这些表达式的正确部分,然后将结果与左侧进行比较? (总是)

c函数参数评估顺序

我理解不能保证函数的参数将被调用的顺序,但是,如果有一个函数调用作为参数,是不是保证会首先调用该函数? 我帮助学生在实验室进行编程的入门课程,他们应该创建一个递归因子函数,它接收n(对于n!)和一个指向整数的指针,该整数将用于计算函数调用,然后它们是应该打印结果(n,n!和count)。 许多人抱怨他们使用指针是错误的,所以我查看了代码,他们都是这样的: int fat(int n,int *count) { (*count)++; if(n>1) { return n * fat(n-1,count); } return 1; } int main() { int n, count=0; do { printf(“Write n for fat (n >= 0): “); scanf(“%d”, &n); }while(n<0); printf("Input: %d. Output: %d.\nFunction called %d times.\n\n", n, fat(n, &count), count); printf("%d times\n",count); return 0; } 用gcc编译(Debian […]

c表达式与c ++表达式之间的差异

int main() { int i=3; (++i)++; printf(“%d”,i); } 这个程序适用于g ++编译器,但不适用于gcc。 如果我写i ++++或++ i ++,它也不能用于cpp。 我认为c-expression和c ++ – expression之间存在差异。 有人可以解释L值和R值吗?

C语言中++ val ++和++ * p ++的解释

int val = 5; printf(“%d”,++val++); //gives compilation error : ‘++’ needs l-value int *p = &val; printf(“%d”,++*p++); //no error 有人可以解释这2个案例吗? 谢谢。

i = ++ i和++ i之间的区别

可能重复: 谁能解释这些未定义的行为(i = i ++ + ++ i,i = i ++等…) i = ++i;之间有什么区别i = ++i; 和++i; 其中i是值为10的整数? 根据我的说法,在完成两个表达式i =11之后,两者都做同样的增量工作。

运算符优先级问题

O / p出现为x = 2,y = 1,z = 1,这与运算符优先级不一致。 我在Turbo c ++编译器上运行它: void main() { int x,y,z,q; x=y=z=1; q=++x || ++y && ++z; printf(“x=%dy=%dz=%d”,x,y,z); }

“在不使用第三个变量的情况下交换两个变量的值”中的潜在问题

我最近提出了这种方法来交换两个变量的值而不使用第三个变量。 a^=b^=a^=b 但是当我在不同的编译器上尝试上面的代码时,我得到了不同的结果,一些给出了正确的结果,一些没有。 代码有什么严重错误吗?

function参数评估顺序

以下操作的结果将打印出来: x=5; printf(“%d,%d,%d\n”,x,x<>2); 答案:5,20,1 我认为订单是未定义的,但我在许多网站上找到了面试问题。