While I was putting together a to-uppercase function in C++ I noticed that I did not receive the expected output in C.
C++ function
#include <iostream>
#include <cctype>
#include <cstdio>
void strupp(char* beg)
{
while (*beg++ = std::toupper(*beg));
}
int main(int charc, char* argv[])
{
char a[] = "foobar";
strupp(a);
printf("%s\n", a);
return 0;
}
Output as expected:
FOOBAR
#include <ctype.h>
#include <stdio.h>
#include <string.h>
void strupp(char* beg)
{
while (*beg++ = toupper(*beg));
}
int main(int charc, char* argv[])
{
char a[] = "foobar";
strupp(a);
printf("%s\n", a);
return 0;
}
The output is the expected result with the first character missing
OOBAR
Does anyone know why the result gets truncated while compiling in C?
The problem is that there is no sequence point in
while (*beg++ = toupper(*beg));
So we have undefined behavior. What the compiler is doing in this case is evaluating beg++
before toupper(*beg)
In C where in C++ it is doing it the other way.