Цикл вида
#include
#include
int main(int argc, char *argv[]) {
int j = atoi(argv[1]);
int k = atoi(argv[2]);
int n = atoi(argv[3]);
for (int i = 0; i < n; ++i) {
j += k;
}
printf("%d\n", j);
схлопывается до printf("%d\n", j + ((n < 0) ? 0 : k*n)) в gcc 4.4.3 (а ему уже 5 лет
(
Read more... )
Comments 27
Reply
@_winnie: BREAKING NEWS!
Reply
Reply
Reply
Reply
Reply
Reply
Reply
Reply
Если из кода ниже выкинуть бесконечный цикл, то обязан сработать assert :)
while(1 != 2);
assert(1 != 2); //assertion should fail
--------
А то что выкидываются циклы
for (int i = 0; i < 10000000; ++i) ; //пауза для пользователя
это известно всем, кто переносил свой код с Паскаля и Турбо-С на Visual C/gcc :)
volatile - полезный трюк, но сильно специфичен конкретно для C++ и вдруг компилятор начнёт незаметно врать - его сложно будет поймать на вранье. А так, если вдруг имеешь дело с неким новым волшебным языком (c ленивыми вычислениями, например), способ "честно обработать данные" самый надёжный.
Reply
Reply
Reply
Работающие в данный момент приемы:
Взять 42 из volatile переменной.
Взять 42 из глобальной переменной (компилятор не знает, вдруг после линковки другой модуль меняет её).
Вызвать функцию через volatile/глобальный указатель на функцию - она не будет инлайнится, так как компилятор не знает, что лежит в этом указателе:
void f(int i) { ... }
void (*pf)(int) = pf;
int main() {
pf();
}
Reply
Leave a comment