C++ (программистское)
Mar. 15th, 2004 10:21 pmПроверьте себя: сумеете ли вы правильно ответить, не запуская, что должна напечатать эта программа:
Я вот не смог, ошибся в одном месте. Значит ли это, что я не помню C++? Наверняка. Я много лет не писал на нём (в отличие от C, на котором пишу время от времени). Но знаете что? я пока не соскучился.
Нафиг, нафиг. Java, C#, да что угодно пусть придёт, но от этого плюсплюсного конгломерата сложных и плохо продуманных синтаксических сталагмитов пора избавляться.
Хотите ещё один курьёз? Пожалуйста. Вот такой код:
что напечатает?
Думаете, "x=101 y=101"? А вот и нет. Он напечатает "x=1 y=101". Угадайте почему.
Когда кто-то писал комментарий, в конце строки вопросительных знаков случайно отпустил shift, и получил слэш. А ??/ — это триграф, обозначающий бэкслэш, т.е. \, и этот \ съедает следующий за ним \n, и делает строку ++x; частью комментария.
Про триграфы можно прочитать здесь. Там же про диграфы есть. Вы знаете, что в C++ можно использовать "and" и "or" вместо && и ||? Я не знал.
Да, кстати, правильные ответы и объяснения по поводу первого куска кода есть здесь. Там же есть ещё много сложных вопросов и мини-статей по синтаксису и возможностям C++.
#include <iostream>
#include <complex>
using namespace std;
class Base {
public:
virtual void f( int ) {
cout << "Base::f(int)" << endl;
}
virtual void f( double ) {
cout << "Base::f(double)" << endl;
}
virtual void g( int i = 10 ) {
cout << i << endl;
}
};
class Derived: public Base {
public:
void f( complex<double> ) {
cout << "Derived::f(complex)" << endl;
}
void g( int i = 20 ) {
cout << "Derived::g() " << i << endl;
}
};
void main() {
Base b;
Derived d;
Base* pb = new Derived;
b.f(1.0);
d.f(1.0);
pb->f(1.0);
b.g();
d.g();
pb->g();
delete pb;
}
Я вот не смог, ошибся в одном месте. Значит ли это, что я не помню C++? Наверняка. Я много лет не писал на нём (в отличие от C, на котором пишу время от времени). Но знаете что? я пока не соскучился.
Нафиг, нафиг. Java, C#, да что угодно пусть придёт, но от этого плюсплюсного конгломерата сложных и плохо продуманных синтаксических сталагмитов пора избавляться.
Хотите ещё один курьёз? Пожалуйста. Вот такой код:
#include <iostream>
#include <complex>
using namespace std;
int main() {
int x=1, y=1;
for( int i = 0; i < 100; ++i ) {
++y;
// What will the next line do? Increment???????????/
++x;
}
cout << "x=" << x << " y=" << y <<endl;
return 0;
}
что напечатает?
Думаете, "x=101 y=101"? А вот и нет. Он напечатает "x=1 y=101". Угадайте почему.
Когда кто-то писал комментарий, в конце строки вопросительных знаков случайно отпустил shift, и получил слэш. А ??/ — это триграф, обозначающий бэкслэш, т.е. \, и этот \ съедает следующий за ним \n, и делает строку ++x; частью комментария.
Про триграфы можно прочитать здесь. Там же про диграфы есть. Вы знаете, что в C++ можно использовать "and" и "or" вместо && и ||? Я не знал.
Да, кстати, правильные ответы и объяснения по поводу первого куска кода есть здесь. Там же есть ещё много сложных вопросов и мини-статей по синтаксису и возможностям C++.
Re: а известно ли благородному дону, что
Date: 2004-03-17 12:26 am (UTC)#!/usr/local/bin/perl
$i = 1;
$i += ++$i + $i++;
print "i = ".$i."\n";
[am@/tmp]$ perl tst.pl
i = 8
Re: а известно ли благородному дону, что
Date: 2004-03-17 03:27 am (UTC)В php всё вычисляется согласно мануалу и логике головы:
Идём справа.
$i++ - постинкремент, возвращает 1, в $i - 2.
++$i - преинкремент, возвращает 3, в $i - 3.
$i += - это $i = $i + , справа от плюса 3+1, $i равно 3.
Итого 7.
А какая логика в перле, я не в курсе.
Кстати, а сколько получается в Java и прочих упомянутых тобой компиляторах?
Кстати,
<script>
var i = 1;
i += ++i + i++;
alert(i);
</script>
в Javacript - 5.
Re: а известно ли благородному дону, что
Date: 2004-03-17 04:30 am (UTC)java: 5 (наверное, правый инкремент в правой части выполняется после всего остального, что достаточно логично)
MS VC — не помню точно, но вроде бы — 4 (инкрементируется всё независимо от единицы, потом складывается).
Re: а известно ли благородному дону, что
Date: 2004-03-17 06:31 am (UTC)Re: а известно ли благородному дону, что
Date: 2004-03-17 06:41 am (UTC)Попробуй
int i = 5;
i += 5;
alert(i);
Причина та же, что и в
Java— я так думаю —inew = iold + right-part-result.Re: а известно ли благородному дону, что
Date: 2004-03-17 06:46 am (UTC)Re: а известно ли благородному дону, что
Date: 2004-03-17 07:04 am (UTC)Re: а известно ли благородному дону, что
Date: 2004-03-17 07:13 am (UTC);-)
Да уж, с интерпретатором тут спокойнее.
Но я бы тому, кто такое пишет — яйца отрывал вне зависимости от того, что напечатает результирующий
printf...Re: а известно ли благородному дону, что
Date: 2004-03-17 04:31 am (UTC)Re: а известно ли благородному дону, что
Date: 2004-03-17 06:47 am (UTC)