Почему такой код работает?
От: rs2  
Дата: 18.05.06 07:35
Оценка: :))
#include "stdafx.h"
#include <string>
using namespace std;

void TestFunc(string hello)
{
    printf("Mdaaa....");
}

int _tmain(int argc, _TCHAR* argv[])
{
    TestFunc("test"),10;
    return 0;
}


интерестно почему это компилится в VC++?
Re: Почему такой код работает?
От: Аноним  
Дата: 18.05.06 07:39
Оценка:
Здравствуйте, rs2, Вы писали:

rs2>интерестно почему это компилится в VC++?


На C++ такого можно написать, что тебе и не снилось. И всё будет соответствовать стандарту и компилироваться.
Re: Почему такой код работает?
От: ned Австралия  
Дата: 18.05.06 07:41
Оценка: 1 (1)
Здравствуйте, rs2, Вы писали:

rs2>интерестно почему это компилится в VC++?


А что не так?
Re: Почему такой код работает?
От: ekamaloff Великобритания  
Дата: 18.05.06 07:45
Оценка: 2 (2)
Здравствуйте, rs2, Вы писали:

rs2>int _tmain(int argc, _TCHAR* argv[])
rs2>{
rs2>    TestFunc("test"),10;
rs2>    return 0;
rs2>}
rs2>


Ну дык оператор "запятая". Слева валидное выражение (вызов функции), справа валидное выражение, все нормально. Комо тоже кстати ничего против не имеет.

Даже в MSDN про него кое-что есть:

The comma operator allows grouping two statements where one is expected.

expression , assignment-expression

The comma operator has left-to-right associativity. Two expressions separated by a comma are evaluated left to right. The left operand is always evaluated, and all side effects are completed before the right operand is evaluated.

Commas can be used as separators in some contexts, such as function argument lists. Do not confuse the use of the comma as a separator with its use as an operator; the two uses are completely different.

Consider the expression

e1 , e2

The type and value of the expression are the type and value of e2; the result of evaluating e1 is discarded. The result is an l-value if the right operand is an l-value.

Where the comma is normally used as a separator (for example in actual arguments to functions or aggregate initializers), the comma operator and its operands must be enclosed in parentheses. For example:
func_one( x, y + 2, z );
func_two( (x--, y + 2), z );

In the function call to func_one above, three arguments, separated by commas, are passed: x, y + 2, and z. In the function call to func_two, parentheses force the compiler to interpret the first comma as the sequential-evaluation operator. This function call passes two arguments to func_two. The first argument is the result of the sequential-evaluation operation (x--, y + 2), which has the value and type of the expression y + 2; the second argument is z.

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Почему такой код работает?
От: rs2  
Дата: 18.05.06 07:48
Оценка:
Здравствуйте, ned, Вы писали:

ned>Здравствуйте, rs2, Вы писали:


rs2>>интерестно почему это компилится в VC++?


ned>А что не так?


А все не так! Вы считаете это нормально? У коллеги получился такой код, по запарке не заметил, я с ним согласен ошибиться оч. легко. Поймать ошибку почти нереально — то работает верно, то глючит. Другое дело если б, работало всегда правильно. Пришлось перелопатить груду кода — а это время!
Re: Почему такой код работает?
От: Bell Россия  
Дата: 18.05.06 07:49
Оценка:
Здравствуйте, rs2, Вы писали:

rs2>
rs2>#include "stdafx.h"
rs2>#include <string>
rs2>using namespace std;

rs2>void TestFunc(string hello)
rs2>{
rs2>    printf("Mdaaa....");
rs2>}

rs2>int _tmain(int argc, _TCHAR* argv[])
rs2>{
rs2>    TestFunc("test"),10;
rs2>    return 0;
rs2>}
rs2>


rs2>интерестно почему это компилится в VC++?


Потому что оператор "запятая" пока еще никто не отменял
Любите книгу — источник знаний (с) М.Горький
Re: Почему такой код работает?
От: Dmitry Kotlyarov Россия  
Дата: 18.05.06 07:50
Оценка:
Здравствуйте, rs2, Вы писали:

rs2>интерестно почему это компилится в VC++?


Что конкретно тебя смущает? Существование конструктора у string, принимающего const char*, или operator, ? Посмотри в этом направлении и разрешишь свои вопросы.
Re: Почему такой код работает?
От: Вумудщзук Беларусь  
Дата: 18.05.06 07:51
Оценка:
>интерестно почему это компилится в VC++?
просто "презумция невиновности" — здесь всё нормально, потому и работает... вот если он не работал, тогда б и стоило вопрошать, почему
Homo sum et nihil humani a me alienum puto...
Re[3]: Почему такой код работает?
От: Bell Россия  
Дата: 18.05.06 07:56
Оценка:
Здравствуйте, rs2, Вы писали:

ned>>А что не так?


rs2>А все не так! Вы считаете это нормально? У коллеги получился такой код, по запарке не заметил, я с ним согласен ошибиться оч. легко. Поймать ошибку почти нереально — то работает верно, то глючит. Другое дело если б, работало всегда правильно. Пришлось перелопатить груду кода — а это время!


Нужно успокоиться, и рассказать общественности, в чем заключается ошибка, что значит "то работает верно, то глючит", что понимается под "Другое дело если б, работало всегда правильно".
Любите книгу — источник знаний (с) М.Горький
Re[3]: Почему такой код работает?
От: ned Австралия  
Дата: 18.05.06 07:59
Оценка:
Здравствуйте, rs2, Вы писали:

rs2>А все не так! Вы считаете это нормально? У коллеги получился такой код, по запарке не заметил, я с ним согласен ошибиться оч. легко. Поймать ошибку почти нереально — то работает верно, то глючит. Другое дело если б, работало всегда правильно. Пришлось перелопатить груду кода — а это время!


А что не работает, то? Где глючит? К чему эта десятка? По-моему, код совершенно корректный.
Re[3]: Почему такой код работает?
От: Максим2006 Беларусь  
Дата: 18.05.06 08:24
Оценка:
Здравствуйте, rs2, Вы писали:

rs2>Здравствуйте, ned, Вы писали:


ned>>Здравствуйте, rs2, Вы писали:


rs2>>>интерестно почему это компилится в VC++?


ned>>А что не так?


rs2>А все не так! Вы считаете это нормально? У коллеги получился такой код, по запарке не заметил, я с ним согласен ошибиться оч. легко. Поймать ошибку почти нереально — то работает верно, то глючит. Другое дело если б, работало всегда правильно. Пришлось перелопатить груду кода — а это время!


глюки (на рантайме) могли быть если есть ещё

void TestFunc(string hello, int n)
{
    printf("Mdaaa.... %d", n);
}

и периодически перепутали

TestFunc("test", 10);

с

TestFunc("test"),10;

так?
Re[4]: Почему такой код работает?
От: rs2  
Дата: 18.05.06 08:43
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Здравствуйте, rs2, Вы писали:


rs2>>Здравствуйте, ned, Вы писали:


ned>>>Здравствуйте, rs2, Вы писали:


rs2>>>>интерестно почему это компилится в VC++?


ned>>>А что не так?


rs2>>А все не так! Вы считаете это нормально? У коллеги получился такой код, по запарке не заметил, я с ним согласен ошибиться оч. легко. Поймать ошибку почти нереально — то работает верно, то глючит. Другое дело если б, работало всегда правильно. Пришлось перелопатить груду кода — а это время!


М>глюки (на рантайме) могли быть если есть ещё


М>
М>void TestFunc(string hello, int n)
М>{
М>    printf("Mdaaa.... %d", n);
М>}
М>

М>и периодически перепутали

М>
М>TestFunc("test", 10);
М>

М>с

М>
М>TestFunc("test"),10;
М>

М> так?

Возможно так... дело в том что эта бага не в моем проекте, поэтому меня просто заинтересовал такой синтаксис...
Re[5]: Почему такой код работает?
От: Кирпа В.А. Украина  
Дата: 18.05.06 09:13
Оценка:
Здравствуйте, rs2, Вы писали:

М>>глюки (на рантайме) могли быть если есть ещё


М>>
М>>void TestFunc(string hello, int n)
М>>{
М>>    printf("Mdaaa.... %d", n);
М>>}
М>>

М>>и периодически перепутали

М>>
М>>TestFunc("test", 10);
М>>

М>>с

М>>
М>>TestFunc("test"),10;
М>>

М>> так?

rs2>Возможно так... дело в том что эта бага не в моем проекте, поэтому меня просто заинтересовал такой синтаксис...


Начнем с того что это вообще не должно компилиться в C++
потому что компилятор выругается что в TestFunc неверное количество параметров
Или это чистый С ?
!0xDEAD
Re[4]: Почему такой код работает?
От: rs2  
Дата: 18.05.06 09:23
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>
М>void TestFunc(string hello, int n=0)
М>{
М>    printf("Mdaaa.... %d", n);
М>}
М>

М>и периодически перепутали

М>
М>TestFunc("test", 10);
М>

М>с

М>
М>TestFunc("test"),10;
М>

М> так?

именно так, с небольшой поправкой (выделено жирным).
из-за небольшой опечатки код работает, но не совсем как надо.
Re[5]: Почему такой код работает?
От: Bell Россия  
Дата: 18.05.06 09:27
Оценка: :))
Здравствуйте, rs2, Вы писали:

rs2>из-за небольшой опечатки код работает, но не совсем как надо.


Ага — "казнить нельзя помиловать"
Любите книгу — источник знаний (с) М.Горький
Re: Почему такой код работает?
От: mukos СССР  
Дата: 18.05.06 10:29
Оценка:
Здравствуйте, rs2, Вы писали:

rs2>
rs2>#include "stdafx.h"
rs2>#include <string>
rs2>using namespace std;

rs2>void TestFunc(string hello)
rs2>{
rs2>    printf("Mdaaa....");
rs2>}

rs2>int _tmain(int argc, _TCHAR* argv[])
rs2>{
rs2>    TestFunc("test"),10;
rs2>    return 0;
rs2>}
rs2>


rs2>интерестно почему это компилится в VC++?


По моему это раскладывается так-
int _tmain(int argc, _TCHAR* argv[])
{
TestFunc("test");
10;
return 0;
}
Re[6]: Почему такой код работает?
От: Максим2006 Беларусь  
Дата: 18.05.06 10:31
Оценка:
Здравствуйте, Кирпа В.А., Вы писали:

КВА>Здравствуйте, rs2, Вы писали:


М>>>глюки (на рантайме) могли быть если есть ещё


М>>>
М>>>void TestFunc(string hello, int n)
М>>>{
М>>>    printf("Mdaaa.... %d", n);
М>>>}
М>>>

М>>>и периодически перепутали

М>>>
М>>>TestFunc("test", 10);
М>>>

М>>>с

М>>>
М>>>TestFunc("test"),10;
М>>>

М>>> так?

rs2>>Возможно так... дело в том что эта бага не в моем проекте, поэтому меня просто заинтересовал такой синтаксис...


КВА>Начнем с того что это вообще не должно компилиться в C++

КВА>потому что компилятор выругается что в TestFunc неверное количество параметров
КВА>Или это чистый С ?

Это вторая (перегруженная) функция (первую см. в первом посте), так что всё скомпиляется
Re[5]: Почему такой код работает?
От: Максим2006 Беларусь  
Дата: 18.05.06 10:37
Оценка:
Здравствуйте, rs2, Вы писали:

rs2>Здравствуйте, Максим2006, Вы писали:


М>>
М>>void TestFunc(string hello, int n=0)
М>>{
М>>    printf("Mdaaa.... %d", n);
М>>}
М>>

М>>и периодически перепутали

М>>
М>>TestFunc("test", 10);
М>>

М>>с

М>>
М>>TestFunc("test"),10;
М>>

М>> так?

rs2>именно так, с небольшой поправкой (выделено жирным).

rs2>из-за небольшой опечатки код работает, но не совсем как надо.

значит у вас не

void TestFunc(string hello)
{
    printf("Mdaaa....");
}

а именно

void TestFunc(string hello, int n=0)
{
    printf("Mdaaa.... %d", n);
}


иначе не компилялось бы, потому что такая перегрузка не правильная
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.