Tag: 序列点

使用XOR交换值

这两个宏有什么区别? #define swap(a, b) (((a) ^ (b)) && ((a) ^= (b) ^= (a) ^= (b))) 要么 #define swap(a, b) (((a) ^ (b)) && ((b) ^= (a) ^= (b), (a) ^= (b))) 我在这里看到了第二个宏但是不明白为什么它不像第一个那样写? 我错过了一个特殊原因吗?

涉及逻辑AND(&&)的复杂表达式

void main(void) { int x,y,z; x=y=z=1; z = x && y && ++z;//is this fine? } 我最近开始阅读有关序列点的东西,但我无法弄清楚上面的代码示例是否正常。 我知道&&运算符引入了一个序列点,所以我不太确定表达式z = x && y && ++ z的行为。 有人请告诉我正确的答案。

又一个序列点查询:* p ++ = getchar()如何工作?

§5.1.2.4.16 实施例7表达式的分组不能完全确定其评估。 在以下片段中: #include int sum; char *p; /* … */ sum = sum * 10 – ‘0’ + (*p++ = getchar()); 表达式语句被分组,就好像它被写为 sum = (((sum * 10) – ‘0’) + ((*(p++)) = (getchar()))); 但是p的实际增量可以在前一个序列点和下一个序列点(;)之间的任何时间发生,并且对getchar的调用可以在需要其返回值之前的任何点发生。 所以基本上我把它理解为未指定的行为 – 要么*p = getchar(); p++; *p = getchar(); p++; 或者p++; *p = getchar() p++; *p = getchar() 。 注意; […]

C / C ++编译器能否通过pthread库调用合法地在寄存器中缓存变量?

假设我们有以下代码: #include #include #include void guarantee(bool cond, const char *msg) { if (!cond) { fprintf(stderr, “%s”, msg); exit(1); } } bool do_shutdown = false; // Not volatile! pthread_cond_t shutdown_cond = PTHREAD_COND_INITIALIZER; pthread_mutex_t shutdown_cond_mutex = PTHREAD_MUTEX_INITIALIZER; /* Called in Thread 1. Intended behavior is to block until trigger_shutdown() is called. */ void wait_for_shutdown_signal() { int res; […]

由于C和C ++中的序列点,您遇到了哪些问题?

以下是由于序列点规则导致未定义行为的两个常见问题: a[i] = i++; //has a read and write between sequence points i = i++; //2 writes between sequence points 您在序列点方面遇到的其他事情是什么? 当编译器无法警告我们时,很难找到这些问题。

作业和序列点:这是多么模糊?

考虑C代码a = a = a 。 没有用于赋值的序列点,因此在编译关于a的未定义操作时,此代码会产生警告。 这里有什么可能的价值? 似乎无法改变价值观。 这里有没有未定义的行为或编译器只是懒惰?

返回语句后的序列点?

在我对这里的一个问题的回答中,我解释了当postfix ++在与return语句相同的行上的全局变量上使用时发生了什么。 C11的资料性附录C表明在return后立即有一个序列点,并参考规范性章节6.8.6.4,其中没有关于序列点的文本可以找到。 我可以在C标准中找到规范性文本,说明return语句后有一个序列点吗? (我只在7.1.4 / 3中找到了规范文本,用于库函数,作为一个特殊情况。)

序列点来自哪里?

我知道写点东西 ++a = a++; 不仅不可读而且违反了c / c ++序列点。 这些限制来自哪里? 在将它们发现为错误之前,如何才能看到这些“问题”?

关于序列点的后增量

post增量运算符何时影响增量? 我遇到了两个意见: 1)来自http://gd.tuwien.ac.at/languages/c/programming-bbrown/c_015.htm : POST表示在任何赋值操作后执行操作。 2)言归正传, 关于SO的回答 (尽管在C ++上)说: …将增量延迟到表达式结束(下一个序列点)。 后增量操作也是如此…… A)等到达到序列点或 B)发生在任务操作员或 C)在序列点之前的任何时间发生?

赋值运算符不是序列点的任何好理由?

operator =不是序列点有什么好的理由吗? 在C和C ++中都有。 我很难想到一个反例。